home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / c / mplus_2.exe / MPLUS.DOC < prev    next >
Text File  |  1991-12-01  |  172KB  |  7,441 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.                                 Start of MPLUS.DOC
  16.  
  17.                   This document is approximately 100 pages long.
  18.  
  19.  
  20.  
  21.  
  22.                     ******************************************
  23.                     HP LaserJet Owners: set form length to 66
  24.                     ******************************************
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.  
  75.  
  76.  
  77.  
  78.  
  79.  
  80.  
  81.  
  82.                    The  MPLUS(TM)  Graphic  Interface  Library
  83.  
  84.                                    Version 1.5
  85.                                  December 1, 1990
  86.  
  87.  
  88.                                  Reference  Guide
  89.                                    Disk Version
  90.  
  91.  
  92.  
  93.  
  94.  
  95.  
  96.                                    Michael Yam
  97.                              230 East 88th St. Apt 6B
  98.                                 New York, NY 10128
  99.  
  100.                                   (212) 996-2582
  101.  
  102.                             Compuserve ID: 76367,3040
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116.                          Copyright 1989-1991  Michael Yam
  117.                                All Rights Reserved.
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137.  
  138.  
  139.  
  140.  
  141.  
  142.  
  143.  
  144.  
  145.  
  146.  
  147.  
  148.  
  149.  
  150.  
  151.  
  152.  
  153.  
  154.  
  155.  
  156.  
  157.  
  158.  
  159.  
  160.  
  161.  
  162.  
  163.  
  164.  
  165.  
  166.  
  167.  
  168.  
  169.  
  170.  
  171.  
  172.  
  173.  
  174.  
  175.  
  176.  
  177.          COPYRIGHTS
  178.  
  179.          MPLUS Software Copyright 1989-1991 by Michael Yam.  All rights
  180.          reserved.
  181.          This document Copyright 1989-1991 by Michael Yam.  All rights
  182.          reserved.
  183.  
  184.  
  185.  
  186.          TRADEMARKS
  187.  
  188.          MPLUS (TM) is a trademark of Michael Yam.
  189.  
  190.          Other brand and product names are trademarks or registered
  191.          trademarks of their respective companies.
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.          MPLUS                                                    Contents
  202.  
  203.  
  204.  
  205.  
  206.  
  207.          CONTENTS
  208.          --------
  209.  
  210.  
  211.  
  212.                   Registration
  213.  
  214.  
  215.                   Introduction
  216.  
  217.  
  218.                   Chapter 1.    Getting Started
  219.  
  220.  
  221.                   Chapter 2.    Graphic Support
  222.  
  223.  
  224.                   Chapter 3.    Graphic Windows
  225.  
  226.  
  227.                   Chapter 4.    Graphic Dialogue
  228.  
  229.  
  230.                   Chapter 5.    Graphic Image
  231.  
  232.  
  233.                   Chapter 6.    Menu Bar
  234.  
  235.  
  236.                   Chapter 7.    Mouse Support
  237.  
  238.  
  239.                   Appendix A.   Function Index
  240.  
  241.  
  242.                   Appendix B.   Revision History
  243.  
  244.  
  245.                   Appendix C.   Library Incompatibilities
  246.  
  247.  
  248.                   Appendix D.   About Source Code
  249.  
  250.  
  251.                   Appendix E.   Shareware
  252.  
  253.  
  254.                   Appendix F.   Obtaining Support
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261.          Copyright 1989-1991 by Michael Yam
  262.  
  263.  
  264.  
  265.  
  266.  
  267.          MPLUS 1.5                                           Registration
  268.  
  269.  
  270.  
  271.  
  272.          REGISTRATION
  273.          ------------
  274.  
  275.  
  276.  
  277.          LICENSE
  278.  
  279.  
  280.          MPLUS is copyright 1989-1991 by Michael Yam.
  281.  
  282.          All versions of MPLUS are not free, nor are they public domain.
  283.          MPLUS is distributed as shareware -- a concept which brings
  284.          quality software to market at a modest price (see Appendix E).
  285.  
  286.  
  287.          For Non-registered Users
  288.          ------------------------
  289.  
  290.          As a non-registered user, you may use the MPLUS small, medium,
  291.          compact, and large model libraries for personal and
  292.          non-commercial purposes.  To this extent, no registration fee is
  293.          required.
  294.  
  295.  
  296.          For Registered Users
  297.          --------------------
  298.  
  299.          As a registered user, you may:
  300.  
  301.              use the MPLUS product like a book.  In other words, the
  302.              MPLUS product may be used by any number of people, and
  303.              may be freely moved from one computer location to
  304.              another, so long as there is no possibility of it being
  305.              used at one location or on one computer while it is
  306.              being used at another.
  307.  
  308.              modify the MPLUS product and/or merge or incorporate the
  309.              MPLUS product into any general use software program of
  310.              your development except for a program of similar nature
  311.              to the MPLUS product.
  312.  
  313.              distribute your programs which you create with the MPLUS
  314.              product, in executable form only, without restriction or
  315.              fee.
  316.  
  317.  
  318.  
  319.  
  320.  
  321.  
  322.  
  323.  
  324.  
  325.  
  326.  
  327.          Copyright 1989-1991 by Michael Yam                             1
  328.  
  329.  
  330.  
  331.  
  332.  
  333.          MPLUS 1.5                                           Registration
  334.  
  335.  
  336.          For Shareware Distributors
  337.          --------------------------
  338.  
  339.          You may distribute the small, medium, compact, and large model
  340.          libraries of MPLUS, and are encouraged to do so but with the
  341.          following limitations:
  342.  
  343.              No price or other consideration may be charged.
  344.              Distribution costs, however, may be charged for the cost
  345.              of disk, and shipping and handling, as long as it does
  346.              not exceed ten dollars ($10.00) total.
  347.  
  348.              The MPLUS libraries and on-disk documentation may not be
  349.              modified in any way and must be distributed together.
  350.  
  351.              The MPLUS product may not be distributed or sold as part
  352.              of any other product.
  353.  
  354.              The printed manual may not be copied or reproduced in
  355.              any way.
  356.  
  357.  
  358.  
  359.  
  360.  
  361.  
  362.  
  363.  
  364.  
  365.  
  366.  
  367.  
  368.  
  369.  
  370.  
  371.  
  372.  
  373.  
  374.  
  375.  
  376.  
  377.          DISCLAIMER OF WARRANTY
  378.  
  379.          This software and manual are sold "as is" and without warranties
  380.          as to performance of merchantability or any other warranties
  381.          whether expressed or implied.  Because of the various hardware
  382.          and software environments into which this program may be placed,
  383.          no warranty of fitness for a particular purpose is offered.
  384.  
  385.          Good data processing procedure dictates that any program be
  386.          thoroughly tested with non-critical data before relying on it.
  387.          The user must assume the entire risk of using the program.  Any
  388.          liability of the seller will be limited exclusively to product
  389.          replacement or refund of purchase price.
  390.  
  391.  
  392.  
  393.          Copyright 1989-1991 by Michael Yam                             2
  394.  
  395.  
  396.  
  397.  
  398.  
  399.          MPLUS 1.5                                           Registration
  400.  
  401.  
  402.          ORDER INFORMATION
  403.  
  404.  
  405.          MPLUS is compatible with Microsoft C 5.x and 6.0, and is
  406.          available in two flavors:
  407.  
  408.              1) Shareware version.
  409.              2) Registered version.
  410.  
  411.  
  412.          For personal, non-commercial use, the shareware version of
  413.          MPLUS is available for ten dollars ($10.00).  This fee covers
  414.          the cost of materials, shipping, and handling.  You may also
  415.          download a copy from Compuserve.  MPLUS resides in the IBMPRO
  416.          forum under "C" (library 3).  MPLUS is also available from
  417.          various shareware vendors.
  418.  
  419.          The shareware version provides the following:
  420.  
  421.              -- Small, medium, compact, and large model libraries.
  422.              -- On disk documentation.
  423.              -- A demo and sample programs.
  424.  
  425.  
  426.          Registration costs fifty dollars ($50.00) per copy and provides
  427.          all of the above including:
  428.  
  429.              -- All source code.
  430.              -- Printed and bound manual.
  431.              -- Support via U.S. mail, Compuserve email, and telephone.
  432.                 (see Appendix F.)
  433.              -- One free upgrade.
  434.              -- Royalty-free license to use the MPLUS product on a
  435.                 regular basis and to distribute your programs created
  436.                 with the MPLUS library.
  437.  
  438.  
  439.          The success of any product depends on its customers'
  440.          satisfaction.  Comments, good and bad, are welcome.  Note: you
  441.          do not have to be a registered user to submit suggestions or
  442.          complaints.
  443.  
  444.          Please use the order form on the next page.
  445.  
  446.  
  447.  
  448.  
  449.  
  450.  
  451.  
  452.  
  453.  
  454.  
  455.  
  456.  
  457.  
  458.  
  459.          Copyright 1989-1991 by Michael Yam                             3
  460.  
  461.  
  462.  
  463.  
  464.  
  465.          MPLUS 1.5                                           Registration
  466.  
  467.  
  468.          ORDER FORM
  469.  
  470.          Send check or money order to:
  471.  
  472.              Michael Yam
  473.              230 East 88th St.  Apt 6B
  474.              New York, NY 10128
  475.  
  476.  
  477.                             Quantity  Price Each     Total Price
  478.  
  479.          Shareware Version  _____     $10.00         $_________
  480.  
  481.          Registered Version _____     $50.00         $_________
  482.  
  483.          Orders outside the U.S.
  484.          and CANADA, please add        $5.00         $_________
  485.  
  486.                                            TOTAL:    $_________
  487.  
  488.  
  489.  
  490.          Microsoft C Version: _____
  491.  
  492.          DSDD Disk Format (check one):  5 1/4" _____      3 1/2" _____
  493.  
  494.  
  495.          Ship To:
  496.  
  497.             Name: _________________________________________
  498.  
  499.          Company: _________________________________________
  500.  
  501.          Address: _________________________________________
  502.  
  503.                 : _________________________________________
  504.  
  505.             City: ____________________  State: _____   Zip: __________
  506.  
  507.          Country (if outside of U.S.): _______________________________
  508.  
  509.          Day Phone: _____________________  Compuserve id: ____________
  510.  
  511.  
  512.          Where did you hear about MPLUS? _____________________________
  513.  
  514.  
  515.  
  516.  
  517.  
  518.  
  519.          Domestic orders shipped via Priority Mail (2 business days).
  520.          International orders: Please send a U.S. postal money order, or
  521.          a check drawn on U.S. bank in U.S. dollars.
  522.  
  523.  
  524.  
  525.          Copyright 1989-1991 by Michael Yam                             4
  526.  
  527.  
  528.  
  529.  
  530.  
  531.          MPLUS                                               INTRODUCTION
  532.  
  533.  
  534.  
  535.  
  536.  
  537.  
  538.          INTRODUCTION
  539.          ------------
  540.  
  541.  
  542.          MPLUS is a graphic interface library for Microsoft C.  If your
  543.          program includes business or scientific charts, fractal images,
  544.          or just sets one pixel, MPLUS may be of use.  By providing
  545.          menus, windows, dialogue boxes, and mouse support, MPLUS gets
  546.          your program up to speed quickly and easily.
  547.  
  548.  
  549.          Is MPLUS for you?  When designing your application...
  550.  
  551.          Remember your software's needs.  If your program deals only with
  552.          characters, a text based windowing system may be what you need.
  553.          If your program requires graphing, multi-tasking, dynamic data
  554.          exchange between applications, and a real time feed to a stock
  555.          quotation system, you may need Microsoft Windows or OS/2.  MPLUS
  556.          is best suited for single-tasking, graphical applications.
  557.  
  558.          Remember your audience.  Will your end-user have a fast 386
  559.          machine with 4 megabytes?  Or will your end-user own IBM's new
  560.          286 based PS/1 for home and school?  Requiring relatively little
  561.          memory, MPLUS will fit comfortably in both extremes.
  562.  
  563.          Remember your timetable.  If you have 5 or more years to develop
  564.          your project, then a long term outlook is necessary.  By then,
  565.          fast 386 machines with 4 megabytes should be commonplace and
  566.          OS/2, Unix, or Windows may be the proper choice for a platform.
  567.          Projects due out in less than 5 years may benefit from MPLUS.
  568.          The venerable 286-AT class machine with 640k is today's and
  569.          tomorrow's most popular machine.  And it won't disappear anytime
  570.          soon (I understand there are still 8088 PCs around).
  571.  
  572.          It's evident that the application's requirements, its audience,
  573.          and its timetable, are all critical in choosing an interface and
  574.          environment.  From a programmer's view, MPLUS' major strengths
  575.          are low memory requirements, a low learning curve, and an
  576.          uncluttered look.  These qualities make MPLUS effective for
  577.          prototyping as well as producing a finished product.  Clearly,
  578.          MPLUS' simplicity doesn't allow it to do as much as the "big
  579.          GUIs", and for some of you, that will be a drawback.  For
  580.          others, simplicity is a virtue.
  581.  
  582.  
  583.                                            (continued on next page...)
  584.  
  585.  
  586.  
  587.  
  588.  
  589.  
  590.  
  591.          Copyright 1989-1991 by Michael Yam                             i
  592.  
  593.  
  594.  
  595.  
  596.  
  597.          MPLUS                                               INTRODUCTION
  598.  
  599.  
  600.          Using the MPLUS library requires some familiarity with
  601.          Microsoft's GRAPHICS library.
  602.  
  603.          Chapter 1 describes the contents of the distribution diskette
  604.          and "getting started" with this package.  Also, read this
  605.          chapter for MSC 5.0 to 6.0 migration issues.
  606.  
  607.          Chapter 2 contains MPLUS functions which generally should
  608.          replace Microsoft's.  The most important of these is
  609.          mpsetvideomode(), which must supercede Microsoft's
  610.          _setvideomode().
  611.  
  612.          Chapter 3 introduces GWDW, a graphic window.  In GRAPHICS.LIB
  613.          text and graphic output were separated, the former displayable
  614.          only in text windows, the latter allowed only in graphic
  615.          viewports.  The graphic window is a hybrid of the two, where
  616.          both text and graphics can be presented.
  617.  
  618.          Chapter 4 discusses an extension to the graphic window: the
  619.          dialogue box.  It presents information on the screen, and at a
  620.          simple level, allows the user to interact with your program.
  621.  
  622.          Chapter 5 is about graphic images -- picking them up, sliding
  623.          them across the screen, and putting them down.  Also described
  624.          are two functions used for rubberbanding effects: xorpt() and
  625.          xorline().
  626.  
  627.          Chapter 6 describes the menu system.  It provides a bar menu and
  628.          up to 5 levels of submenus. Menu titles and program functions
  629.          are easily plugged in.
  630.  
  631.          Chapter 7 provides support for the Microsoft or compatible
  632.          mouse.  The routines here are not purely "C" interfaces to the
  633.          mouse interrupt, 33H.  You'll also find an event handler and a
  634.          function which retrieves input from both the mouse and the
  635.          keyboard.
  636.  
  637.  
  638.  
  639.  
  640.  
  641.  
  642.  
  643.  
  644.  
  645.  
  646.  
  647.  
  648.  
  649.  
  650.  
  651.  
  652.  
  653.  
  654.  
  655.  
  656.  
  657.          Copyright 1989-1991 by Michael Yam                            ii
  658.  
  659.  
  660.  
  661.  
  662.  
  663.          MPLUS                                            GETTING STARTED
  664.  
  665.  
  666.  
  667.  
  668.  
  669.  
  670.          CHAPTER 1
  671.          ---------
  672.  
  673.  
  674.          SYSTEM REQUIREMENTS
  675.  
  676.              PS/2, PC/XT/AT or close compatible.
  677.              DOS 2.0 and up.
  678.              CGA, EGA, or VGA graphic display (EGA or VGA recommended).
  679.              Microsoft C version 5.0, 5.1, or 6.0 (and GRAPHICS.LIB).
  680.              Microsoft or compatible mouse (optional).
  681.  
  682.  
  683.          ON DISK
  684.  
  685.          The distribution disk contains the following files:
  686.  
  687.  
  688.              MPLUS.DOC           MPLUS documentation.
  689.              README.DOC          Last minute changes.
  690.              ORDER.FRM           MPLUS order form.
  691.              MPDEMO.EXE          Demos MPLUS' latest features.
  692.  
  693.              HELVB.FON           MSC 6.0 fonts used by MPDEMO.EXE.
  694.              SCRIPT.FON
  695.              TMSRB.FON
  696.  
  697.              SMPLUS.LIB          Small model library.
  698.              MMPLUS.LIB          Medium model library.
  699.              CMPLUS.LIB          Compact model library.
  700.              LMPLUS.LIB          Large model library.
  701.  
  702.              GPLUS.H             For MPLUS graphics functions.
  703.              GSCREEN.H           Screen attribute constants.
  704.              MOUSER.H            Header file for mouse support.
  705.              MPMENU.H            Header file for new menu system.
  706.  
  707.              GWDWDEMO.C          Opens three windows, plots sine and
  708.                                  cosine waves.
  709.              GDDEMO.C            Samples of various dialogue boxes.
  710.              MENUDEMO.C          Illustrates new menu system.
  711.              PUSHDEMO.C          Example of a 3-D push button.  Requires
  712.                                  a mouse.
  713.  
  714.              MPORIGIN.C          For MSC 6.0 compatibility, add this to
  715.                                  the MPLUS library.
  716.  
  717.  
  718.          Source code to the MPLUS library is available to registered
  719.          users and is discussed in Appendix D.
  720.  
  721.  
  722.  
  723.          Copyright 1989-1991 by Michael Yam           Getting Started 1-1
  724.  
  725.  
  726.  
  727.  
  728.  
  729.          MPLUS                                            GETTING STARTED
  730.  
  731.  
  732.          USING MPLUS
  733.  
  734.          A suggested way of installing MPLUS is to copy the desired MPLUS
  735.          library into your Microsoft C library subdirectory \MSC\LIB and
  736.          the headers into Microsoft's \MSC\INCLUDE.
  737.  
  738.          Virtually every MPLUS function requires that you include
  739.          Microsoft's "graph.h" header file and it must be placed before
  740.          any of MPLUS' own header files.
  741.  
  742.          For example:
  743.  
  744.              #include <graph.h>       /* Microsoft's */
  745.              #include <gplus.h>       /* MPLUS' */
  746.  
  747.  
  748.          The application program should be linked with Microsoft's
  749.          GRAPHICS.LIB and with the correct memory model of the MPLUS
  750.          library.  If you have a mouse, remember to load the driver.  The
  751.          MPLUS mouse functions will check for the presence of a mouse and
  752.          use it if found.
  753.  
  754.          The example below builds the graphic window demo, GWDEMO.EXE, in
  755.          the large memory model.
  756.  
  757.              cl -AL gwddemo.c -link graphics lmplus
  758.  
  759.  
  760.          If you've built a combined Microsoft library, one that already
  761.          contains GRAPHICS.LIB, then just omit the "graphics"
  762.          specification from the command line.
  763.  
  764.          Note: There is no huge model library of MPLUS.  Huge model
  765.          programs may be linked with the large model MPLUS library.
  766.  
  767.  
  768.  
  769.  
  770.  
  771.  
  772.  
  773.  
  774.  
  775.  
  776.  
  777.  
  778.  
  779.  
  780.  
  781.  
  782.  
  783.  
  784.  
  785.  
  786.  
  787.  
  788.  
  789.          Copyright 1989-1991 by Michael Yam           Getting Started 1-2
  790.  
  791.  
  792.  
  793.  
  794.  
  795.          MPLUS                                            GETTING STARTED
  796.  
  797.  
  798.          FROM MSC 5.x TO 6.0
  799.  
  800.          If you are using Microsoft C 6.0, you'll discover an unresolved
  801.          external when linking with the MPLUS library.  MSC 6.0 renamed a
  802.          couple of its functions, replacing 5.x's _getlogcoord() and
  803.          _setlogorg() with _getviewcoord() and _setvieworg(),
  804.          respectively.
  805.  
  806.          If you are a registered user, you have access to the MPLUS
  807.          source code and can rebuild the entire system using MSC 6.0.  A
  808.          make file for NMAKE is provided: MPLUS.NMK.  Refer to Appendix D
  809.          for more details.
  810.  
  811.          If you don't have access to source, or don't want to rebuild the
  812.          system, compile MPORIGIN.C (using MSC 6.0) in the model of your
  813.          choice and add it to the appropriate MPLUS library.  The example
  814.          below does this for the small memory model.
  815.  
  816.              cl -c -AS -Ox -Zl MPORIGIN.C
  817.              lib SMPLUS.LIB + MPORIGIN,;
  818.  
  819.  
  820.          Please note that while the MPORIGIN solution is quick and easy,
  821.          rebuilding the MPLUS system with MSC 6.0 yields optimal code.
  822.  
  823.  
  824.  
  825.  
  826.  
  827.  
  828.  
  829.  
  830.  
  831.  
  832.  
  833.  
  834.  
  835.  
  836.  
  837.  
  838.  
  839.  
  840.  
  841.  
  842.  
  843.  
  844.  
  845.  
  846.  
  847.  
  848.  
  849.  
  850.  
  851.  
  852.  
  853.  
  854.  
  855.          Copyright 1989-1991 by Michael Yam           Getting Started 1-3
  856.  
  857.  
  858.  
  859.  
  860.  
  861.          MPLUS                                            GETTING STARTED
  862.  
  863.  
  864.          FUNCTION SUMMARY
  865.  
  866.              Routine             Purpose
  867.              ------------------------------------------------------------
  868.              dev_ready           Checks the keyboard and mouse for input.
  869.              gdclose()           Closes a dialogue box.
  870.              gdialog()           Opens a dialogue box.
  871.              gdprompt()          Solicits a response from the user.
  872.              gdwrite()           Outputs text to dialogue box.
  873.              ginput()            Input routine.
  874.              ginrectangle()      Determines if point x,y lies in a
  875.                                  rectangle or not.
  876.              ginwindow()         Determines if point x,y lies in a
  877.                                  graphic window or not.
  878.              gpickup()           "Picks up" a rectangular object from the
  879.                                  screen.
  880.              gputdown()          "Puts down" a rectangular object to the
  881.                                  screen.
  882.              grootclose()        Closes the root window.
  883.              grootopen()         Opens the root window using graphic
  884.                                  coordinates.
  885.              groottopen()        Opens the root window using text
  886.                                  coordinates.
  887.              gwdwclose()         Closes a graphic window.
  888.              gwdwclr()           Clears a graphic window.
  889.              gwdwgetactv()       Gets the active graphic window.
  890.              gwdwgetorg()        Gets the logical origin of a graphic
  891.                                  window.
  892.              gwdwopen()          Opens a graphic window using graphic
  893.                                  coordinates.
  894.              gwdwsetactv()       Makes a graphic window active for
  895.                                  output.
  896.              gwdwsetorg()        Sets the logical origin of a graphic
  897.                                  window.
  898.              gwdwtopen()         Opens a graphic window using text
  899.                                  coordinates.
  900.              loghighlite()       Highlights an image specified by logical
  901.                                  coordinates.
  902.  
  903.  
  904.  
  905.  
  906.  
  907.  
  908.  
  909.  
  910.  
  911.  
  912.  
  913.  
  914.  
  915.  
  916.  
  917.  
  918.  
  919.  
  920.  
  921.          Copyright 1989-1991 by Michael Yam           Getting Started 1-4
  922.  
  923.  
  924.  
  925.  
  926.  
  927.          MPLUS                                            GETTING STARTED
  928.  
  929.  
  930.          FUNCTION SUMMARY (continued)
  931.  
  932.              Routine             Purpose
  933.              ------------------------------------------------------------
  934.              mb_close()          Closes the menu bar.
  935.              mb_hide()           Hides the menu bar.
  936.              mb_open()           Initializes the menu bar and displays it
  937.                                  on screen.
  938.              mb_run()            Runs the menu bar.
  939.              mb_setbits()        Enables/Disables menu bar attributes.
  940.              mb_show()           Shows the menu bar hidden by mb_hide().
  941.              mb_stdcolors()      Initializes menu system to default
  942.                                  colors (EGA & VGA).
  943.              mpgetimage()        Saves a rectangular screen image.
  944.              mpmemavl()          Determines the number of kilobytes free.
  945.              mpoutchar()         Outputs a character in specified
  946.                                  foreground and background colors.
  947.              mpoutgtext()        Outputs text in the current font using
  948.                                  specified foreground and background
  949.                                  colors.
  950.              mpouttext()         Outputs text in specified foreground and
  951.                                  background colors.
  952.              mpputimage()        Restores a rectangular image to screen.
  953.              mpsetvideomode()    Sets the screen's video mode.
  954.              mpwordwrap()        Enables/Disables wordwrap when using
  955.                                  mpouttext().
  956.              ms_cursor()         Returns the status of the cursor -- on
  957.                                  or off.
  958.              ms_getposition()    Gets the cursor position and the status
  959.                                  of the mouse buttons.
  960.              ms_getpress()       Gets the number of times the specified
  961.                                  button was pressed.
  962.              ms_getrelease()     Gets the number of times the specified
  963.                                  button was released.
  964.              ms_hidecursor()     Hides the mouse cursor.
  965.              ms_poll()           Polls the mouse for input.
  966.              ms_ready()          Determines if the mouse has input.
  967.              ms_reset()          Resets the mouse driver.
  968.              ms_setevent()       Enables/Disables mouse event checking.
  969.              ms_setposition()    Positions the cursor at specified
  970.                                  coordinates.
  971.              ms_showcursor()     Displays the mouse cursor.
  972.              ms_window()         Defines the screen region where the
  973.                                  mouse may roam.
  974.              physhighlite()      Highlights an image specified by
  975.                                  physical coordinates.
  976.              xorline()           Draws a line using the XOR operator.
  977.              xorpt()             Draws a point using the XOR operator.
  978.  
  979.  
  980.  
  981.  
  982.  
  983.  
  984.  
  985.  
  986.  
  987.          Copyright 1989-1991 by Michael Yam           Getting Started 1-5
  988.  
  989.  
  990.  
  991.  
  992.  
  993.          MPLUS                                            GRAPHIC SUPPORT
  994.  
  995.  
  996.  
  997.  
  998.  
  999.  
  1000.  
  1001.          CHAPTER  2
  1002.          ----------
  1003.  
  1004.  
  1005.  
  1006.          GRAPHIC SUPPORT
  1007.  
  1008.          The routines here are named after Microsoft's functions and are
  1009.          distinguished by an "mp" prefix instead of an underscore (eg:
  1010.          mpsetvideomode() vs. _setvideomode() ).  They behave similarly
  1011.          to the originals but have additional features.
  1012.  
  1013.          Of these functions, only mpsetvideomode() must supercede
  1014.          Microsoft's version.  The mpsetvideomode() function maintains
  1015.          external variables which other MPLUS functions need to
  1016.          reference.  You may also reference these variables by setting up
  1017.          the appropriate declarations (see function description).
  1018.  
  1019.          Pre-1.3 versions of MPLUS used the function names outtext() and
  1020.          setvideomode().  Programs using these names will still compile
  1021.          because of macros defined in "gplus.h", but it is recommended
  1022.          that you use the "mp" versions for future compatibility with
  1023.          MPLUS.
  1024.  
  1025.  
  1026.  
  1027.  
  1028.  
  1029.  
  1030.  
  1031.  
  1032.  
  1033.  
  1034.  
  1035.  
  1036.  
  1037.  
  1038.  
  1039.  
  1040.  
  1041.  
  1042.  
  1043.  
  1044.  
  1045.  
  1046.  
  1047.  
  1048.  
  1049.  
  1050.  
  1051.  
  1052.  
  1053.          Copyright 1989-1991 by Michael Yam          Graphic Support  2-1
  1054.  
  1055.  
  1056.  
  1057.  
  1058.  
  1059.          MPLUS                                            GRAPHIC SUPPORT
  1060.  
  1061.  
  1062.          FUNCTION SUMMARY
  1063.  
  1064.              Routine                  Purpose
  1065.              ----------------------------------------------------------
  1066.              mpinput()                Obtains data entry from the user.
  1067.              mpmemavl()               Determines the amount of
  1068.                                       conventional memory available.
  1069.              mpoutchar()              Outputs a character in the
  1070.                                       specified foreground and background
  1071.                                       colors.
  1072.              mpouttext()              Outputs text in the specified
  1073.                                       foreground and background colors.
  1074.              mpoutgtext()             Outputs text using the current font
  1075.                                       in the specified foreground and
  1076.                                       background colors.
  1077.              mpsetvideomode()         Sets the screen's video mode.
  1078.              mpwordwrap()             Enables/Disables word wrap when
  1079.                                       using mpouttext().
  1080.  
  1081.  
  1082.  
  1083.  
  1084.  
  1085.  
  1086.  
  1087.  
  1088.  
  1089.  
  1090.  
  1091.  
  1092.  
  1093.  
  1094.  
  1095.  
  1096.  
  1097.  
  1098.  
  1099.  
  1100.  
  1101.  
  1102.  
  1103.  
  1104.  
  1105.  
  1106.  
  1107.  
  1108.  
  1109.  
  1110.  
  1111.  
  1112.  
  1113.  
  1114.  
  1115.  
  1116.  
  1117.  
  1118.  
  1119.          Copyright 1989-1991 by Michael Yam          Graphic Support  2-2
  1120.  
  1121.  
  1122.  
  1123.  
  1124.  
  1125.          MPLUS                                                    mpinput
  1126.  
  1127.  
  1128.          SUMMARY
  1129.  
  1130.          #include <ctype.h>
  1131.          #include <graph.h>
  1132.          #include <gplus.h>
  1133.          #include <gscreen.h>
  1134.  
  1135.          unsigned int mpinput(field, maxlen, ctype, fg, bg);
  1136.          char *field;                 pointer to storage for user input
  1137.          char maxlen;                 maximum length of field
  1138.          unsigned char ctype;         allowable character types
  1139.          short fg,bg;                 foreground and background colors
  1140.  
  1141.  
  1142.          DESCRIPTION
  1143.  
  1144.          The mpinput() function retrieves keyboard input from the user
  1145.          and stores it in the location pointed to by "field."  "field"
  1146.          can either be empty or contain a null terminated string.  In the
  1147.          case of the latter, the string would be displayed with the
  1148.          cursor positioned at its end; input would begin there.
  1149.  
  1150.          Edit keys supported by mpinput() include backspace, home, end,
  1151.          left arrow, right arrow, and insert/overstrike toggle.
  1152.  
  1153.          mpinput() also provides simple filtering based on the constants
  1154.          defined in "ctype.h."  They are summarized below:
  1155.  
  1156.              Constant       Meaning
  1157.              ----------------------------------------------------------
  1158.              _UPPER         allow upper case letters
  1159.              _LOWER         allow lower case letters
  1160.              _DIGIT         allow digits
  1161.              _SPACE         allow tab, carriage return, newline
  1162.              _PUNCT         allow punctuation characters
  1163.              _CONTROL       allow control characters
  1164.              _BLANK         allow space char (0x20)
  1165.              _HEX           allow hexadecimal digits
  1166.  
  1167.  
  1168.          These constants can be "or'd" together to permit characters of
  1169.          various combinations.  Passing a 0xFF for "ctype" will permit
  1170.          any type of character.
  1171.  
  1172.          Constants for "fg" and "bg" are available in "gscreen.h."
  1173.  
  1174.  
  1175.  
  1176.  
  1177.  
  1178.  
  1179.  
  1180.  
  1181.  
  1182.  
  1183.  
  1184.  
  1185.          Copyright 1989-1991 by Michael Yam          Graphic Support  2-3
  1186.  
  1187.  
  1188.  
  1189.  
  1190.  
  1191.          MPLUS                                                    mpinput
  1192.  
  1193.  
  1194.          RETURN VALUE
  1195.  
  1196.          This function returns four possible scan and ascii codes:
  1197.  
  1198.              Code           Meaning
  1199.              ------------------------------------------
  1200.              0x1C0D         Carriage return
  1201.              0x011B         Escape
  1202.              0x0F09         Tab
  1203.              0x0F00         Shift Tab
  1204.  
  1205.  
  1206.          These keys break the user out of mpinput().  Subsequent actions
  1207.          remain with the programmer although a carriage return could mean
  1208.          "accept input", and escape could mean "cancel input." Tab and
  1209.          shift tab have been provided in the case where there are several
  1210.          input fields and the user wishes to "tab" among them.
  1211.  
  1212.          Note: support for the mouse has not been implemented.
  1213.  
  1214.  
  1215.          EXAMPLE
  1216.  
  1217.          #include <ctype.h>
  1218.          #include <graph.h>
  1219.          #include <gplus.h>
  1220.          #include <gscreen.h>
  1221.  
  1222.          main()
  1223.          {
  1224.              char field [50+1];       /* +1 for null */
  1225.              int keycode;
  1226.  
  1227.              mpsetvideomode (_ERESCOLOR);
  1228.  
  1229.              strcpy (field, "The quick brown fox ");
  1230.              mpouttext ("Enter text: ", BRIGHTWHITE, BLACK);
  1231.              keycode = mpinput (field, sizeof (field),
  1232.                   _UPPER | _LOWER | _DIGIT | _BLANK | _PUNCT,
  1233.                   LIGHTYELLOW, BLUE);
  1234.  
  1235.              _settextposition (5, 1);
  1236.              mpouttext ("Buffer contents: ", LIGHTYELLOW, BLACK);
  1237.              mpouttext (field, BRIGHTWHITE, BLUE);
  1238.  
  1239.              sprintf (field, "\nReturn code = %04x hex\n", keycode);
  1240.              mpouttext (field, LIGHTYELLOW, BLACK);
  1241.  
  1242.              getch();
  1243.              mpsetvideomode (_DEFAULTMODE);
  1244.          }
  1245.  
  1246.          Note: portions of this function was donated by R. Michael
  1247.          McMahon
  1248.  
  1249.  
  1250.  
  1251.          Copyright 1989-1991 by Michael Yam          Graphic Support  2-4
  1252.  
  1253.  
  1254.  
  1255.  
  1256.  
  1257.          MPLUS                                                   mpmemavl
  1258.  
  1259.  
  1260.          SUMMARY
  1261.  
  1262.          #include <graph.h>
  1263.          #include <gplus.h>
  1264.  
  1265.          unsigned int mpmemavl(void);
  1266.  
  1267.  
  1268.          DESCRIPTION
  1269.  
  1270.          The mpmemavl() function determines the amount of available
  1271.          memory to the nearest kilobyte.  When programming in the small
  1272.          and medium models, this function is similar to _memavl(),
  1273.          returning the number of bytes available in the near data
  1274.          segment.
  1275.  
  1276.          When programming in the compact or large models, mpmemavl()
  1277.          returns the number of kilobytes available in conventional memory
  1278.          (RAM between 0 and 640kb).
  1279.  
  1280.  
  1281.          RETURN VALUE
  1282.  
  1283.          This function returns an unsigned integer indicating the number
  1284.          of kilobytes free.
  1285.  
  1286.  
  1287.          EXAMPLE
  1288.  
  1289.          Compile this example in the small and large memory models to see
  1290.          the difference between _memavl() and mpmemavl():
  1291.  
  1292.          #include <malloc.h>
  1293.          #include <graph.h>
  1294.  
  1295.          #include <gplus.h>
  1296.  
  1297.          main()
  1298.          {
  1299.              printf( "_memavl()  = %u bytes\n", _memavl() );
  1300.              printf( "mpmemavl() = %u kb\n", mpmemavl() );
  1301.          }
  1302.  
  1303.  
  1304.  
  1305.  
  1306.  
  1307.  
  1308.  
  1309.  
  1310.  
  1311.  
  1312.  
  1313.  
  1314.  
  1315.  
  1316.  
  1317.          Copyright 1989-1991 by Michael Yam          Graphic Support  2-5
  1318.  
  1319.  
  1320.  
  1321.  
  1322.  
  1323.          MPLUS                                                  mpoutchar
  1324.  
  1325.  
  1326.          SUMMARY
  1327.  
  1328.          #include <gplus.h>
  1329.          #include <gscreen.h>
  1330.  
  1331.          void mpoutchar(ch, fg, bg);
  1332.          char ch;                     char to print
  1333.          short fg;                    color of output character
  1334.          short bg;                    color of background
  1335.  
  1336.  
  1337.          DESCRIPTION
  1338.  
  1339.          The mpoutchar() function outputs a character in graphics mode
  1340.          with the color specified by "fg" and on a background specified
  1341.          by "bg."
  1342.  
  1343.          This function behaves similarly to mpouttext() but applies to
  1344.          characters instead of strings.  mpoutchar() does not, however,
  1345.          support word wrap and scrolling, nor does it advance the text
  1346.          cursor.
  1347.  
  1348.          Color constants for "fg" and "bg" are available in "gscreen.h."
  1349.  
  1350.  
  1351.          RETURN VALUE
  1352.  
  1353.          None.
  1354.  
  1355.  
  1356.          EXAMPLE
  1357.  
  1358.          #include <graph.h>
  1359.          #include <gplus.h>
  1360.          #include <gscreen.h>
  1361.  
  1362.          main()
  1363.          {
  1364.              mpsetvideomode (_ERESCOLOR);
  1365.  
  1366.              _settextposition (5, 5);
  1367.              mpoutchar ('A', RED, BLACK);
  1368.              _settextposition (6, 5);
  1369.              mpoutchar ('B', YELLOW, BLACK);
  1370.              _settextposition (7, 5);
  1371.              mpoutchar ('C', GREEN, BLACK);
  1372.  
  1373.              mpsetvideomode (_DEFAULTMODE);
  1374.          }
  1375.  
  1376.  
  1377.  
  1378.  
  1379.  
  1380.  
  1381.  
  1382.  
  1383.          Copyright 1989-1991 by Michael Yam          Graphic Support  2-6
  1384.  
  1385.  
  1386.  
  1387.  
  1388.  
  1389.          MPLUS                                                  mpouttext
  1390.  
  1391.  
  1392.          SUMMARY
  1393.  
  1394.          #include <gplus.h>
  1395.          #include <gscreen.h>
  1396.  
  1397.          void mpouttext(text,fg,bg);
  1398.          char *text;                  null terminated string
  1399.          short fg;                    color of output text
  1400.          short bg;                    color of background
  1401.  
  1402.  
  1403.          DESCRIPTION
  1404.  
  1405.          The mpouttext() function outputs text in graphics mode with the
  1406.          color specified by "fg" and on a background specified by "bg".
  1407.          When writing to a graphic window (see chapter 3), set "bg" to -1
  1408.          if you want to use that window's background color.  Using -1
  1409.          results in faster text output.
  1410.  
  1411.          Manifest constants for 16 colors in EGA and VGA modes are
  1412.          available in the gscreen.h.  The constants are not valid for
  1413.          _MRES256COLOR mode.
  1414.  
  1415.          When printing to a window established by gwdwtopen() or by
  1416.          gwdwopen(), output moves left to right and top to bottom.  Text
  1417.          will scroll automatically and will wordwrap if enabled with
  1418.          mpwordwrap().
  1419.  
  1420.          mpouttext() can write only to the current visual page whereas
  1421.          Microsoft's _outtext() writes to the active page, whether it is
  1422.          visual or not.
  1423.  
  1424.  
  1425.          RETURN VALUE
  1426.  
  1427.          None.
  1428.  
  1429.  
  1430.  
  1431.  
  1432.  
  1433.  
  1434.  
  1435.  
  1436.  
  1437.  
  1438.  
  1439.  
  1440.  
  1441.  
  1442.  
  1443.  
  1444.  
  1445.  
  1446.  
  1447.  
  1448.  
  1449.          Copyright 1989-1991 by Michael Yam          Graphic Support  2-7
  1450.  
  1451.  
  1452.  
  1453.  
  1454.  
  1455.          MPLUS                                                  mpouttext
  1456.  
  1457.  
  1458.          EXAMPLE
  1459.  
  1460.          This example outputs text in various foreground and background
  1461.          colors.  Wordwrap and scrolling is also demonstrated.
  1462.  
  1463.          #include <graph.h>
  1464.  
  1465.          #include <gplus.h>
  1466.          #include <gscreen.h>
  1467.  
  1468.          main()
  1469.          {
  1470.              char buffer[51];
  1471.              int i;
  1472.              GWDW *gwptr;
  1473.  
  1474.              mpsetvideomode( _ERESCOLOR );
  1475.              gwptr = gwdwtopen( 5, 10, 15, 60,
  1476.                                 _GBORDER, BRIGHTWHITE, BLUE );
  1477.              mpouttext( "This appears in BRIGHTWHITE on BLUE.\n",
  1478.                          BRIGHTWHITE, BLUE );
  1479.              mpouttext( "So does this.  But this is faster.\n",
  1480.                          BRIGHTWHITE, -1 );
  1481.              mpouttext( "Here's BRIGHTWHITE on GREEN.\n",
  1482.                          BRIGHTWHITE, GREEN );
  1483.              mpouttext( "BLACK on CYAN gives good contrast.\n",
  1484.                          BLACK, CYAN );
  1485.  
  1486.              mpouttext( "\nWordwrap is off...", BRIGHTWHITE, -1 );
  1487.              getch();
  1488.              for( i=0; i<10; ++i )
  1489.              {
  1490.                   sprintf( buffer, "The quick brown fox jumped over the
  1491.                                     lazy dog. ");
  1492.                   mpouttext( buffer, LIGHTYELLOW, -1);
  1493.              }
  1494.  
  1495.              mpwordwrap(1);
  1496.              mpouttext( "\nWordwrap is on...", BRIGHTWHITE, -1 );
  1497.              getch();
  1498.              for( i=0; i<10; ++i )
  1499.              {
  1500.                   sprintf( buffer, "The quick brown fox jumped over the
  1501.                                     lazy dog. ");
  1502.                   mpouttext( buffer, LIGHTYELLOW, -1);
  1503.              }
  1504.              sprintf( buffer, "\nPress a key...");
  1505.              mpouttext( buffer, LIGHTRED, -1 );
  1506.              getch();
  1507.              gwdwclose( gwptr );
  1508.              mpsetvideomode( _DEFAULTMODE );
  1509.          }
  1510.  
  1511.  
  1512.  
  1513.  
  1514.  
  1515.          Copyright 1989-1991 by Michael Yam          Graphic Support  2-8
  1516.  
  1517.  
  1518.  
  1519.  
  1520.  
  1521.          MPLUS                                                 mpoutgtext
  1522.  
  1523.  
  1524.          SUMMARY
  1525.  
  1526.          #include <graph.h>
  1527.          #include <gplus.h>
  1528.  
  1529.          void mpoutgtext(gtext,fg,bg);
  1530.          char *gtext;                 null terminated string
  1531.          short fg;                    color of output text
  1532.          short bg;                    color of background
  1533.  
  1534.  
  1535.          DESCRIPTION
  1536.  
  1537.          This function is available only to Microsoft C 6.0 and above.
  1538.  
  1539.          The mpoutgtext() function displays "gtext" using the current
  1540.          font in the specified foreground and background colors.  A font
  1541.          must be registered and set, otherwise, unpredictable results
  1542.          would occur.
  1543.  
  1544.          The newline character ('\n') is recognized allowing output to
  1545.          continue on the next line.  Although the orientation of fonts
  1546.          can be set with Microsoft's _setgtextvector(), mpoutgtext() only
  1547.          displays output left to right.  Output going beyond the graphic
  1548.          window (viewport) will be clipped; scrolling and word wrap is
  1549.          not supported.
  1550.  
  1551.          As with any of MSC's graphic output functions, font output
  1552.          affects the current graphic output position.  Use
  1553.          _getcurrentposition() to obtain the position's coordinates.
  1554.  
  1555.          Regarding the foreground and background colors, manifest
  1556.          constants for 16 color EGA and VGA modes are available in
  1557.          gscreen.h.  When writing to a graphic window (see chapter 3),
  1558.          you may set "bg" to -1 to use the default background color.
  1559.  
  1560.  
  1561.  
  1562.  
  1563.  
  1564.  
  1565.  
  1566.  
  1567.  
  1568.  
  1569.  
  1570.  
  1571.  
  1572.  
  1573.  
  1574.  
  1575.  
  1576.  
  1577.  
  1578.  
  1579.  
  1580.  
  1581.          Copyright 1989-1991 by Michael Yam          Graphic Support  2-9
  1582.  
  1583.  
  1584.  
  1585.  
  1586.  
  1587.          MPLUS                                                 mpoutgtext
  1588.  
  1589.  
  1590.          EXAMPLE
  1591.  
  1592.          #include <graph.h>
  1593.          #include <gplus.h>
  1594.          #include <gscreen.h>
  1595.  
  1596.          main()
  1597.          {
  1598.              mpsetvideomode (_ERESCOLOR);
  1599.  
  1600.              _registerfonts ("SCRIPT.FON");
  1601.              _registerfonts( "HELVB.FON" );
  1602.              _setfont("t'script' h32w18b");   /* 32x18, best fit */
  1603.  
  1604.              _moveto (0,0);
  1605.              mpoutgtext ("Eat at Joe's\n\n", LIGHTRED, BLACK);
  1606.  
  1607.              _setfont ("t'Helv' h16w9b");
  1608.              mpoutgtext ("Tofu Burger w/cheese....$4.50\n",
  1609.                                            WHITE, BLACK);
  1610.              mpoutgtext ("Skim milk w/chocolate syrup....$0.95\n",
  1611.                                            WHITE, BLACK);
  1612.  
  1613.              getch();
  1614.              _unregisterfonts();
  1615.              mpsetvideomode (_DEFAULTMODE);
  1616.          }
  1617.  
  1618.  
  1619.          NOTES
  1620.  
  1621.          I've discovered it's a good idea to register and set your fonts
  1622.          early in your code, before any calls to malloc() and free().
  1623.          _registerfonts() and _setfonts() need to allocate memory for
  1624.          themselves but don't like using memory that was once malloc()'d
  1625.          and free()'d.  In other words, _registerfonts() and _setfonts()
  1626.          can fail if the only memory around is "dirty."
  1627.  
  1628.          I've tested this only in MSC 6.0.  Perhaps a future version of
  1629.          MSC solves this problem.  In the meantime, you'll need to do
  1630.          something like so:
  1631.  
  1632.              _registerfonts("HELVB.FON");
  1633.              _registerfonts("SCRIPT.FON");
  1634.              _setfont("t'Helv'");
  1635.              _setfont("t'script'");
  1636.  
  1637.  
  1638.          This reserves the required memory up front.  Don't worry about
  1639.          setting the font attributes (height, width, spacing, etc...) at
  1640.          this point.  When you are ready to issue an mpoutgtext() or
  1641.          _outgtext(), set your font again but with the desired traits.
  1642.  
  1643.  
  1644.  
  1645.  
  1646.  
  1647.          Copyright 1989-1991 by Michael Yam         Graphic Support  2-10
  1648.  
  1649.  
  1650.  
  1651.  
  1652.  
  1653.          MPLUS                                             mpsetvideomode
  1654.  
  1655.  
  1656.          SUMMARY
  1657.  
  1658.          #include <graph.h>
  1659.          #include <gplus.h>
  1660.  
  1661.          int mpsetvideomode(mode);
  1662.          short mode;                  video mode
  1663.  
  1664.  
  1665.          DESCRIPTION
  1666.  
  1667.          This function operates just like Microsoft's _setvideomode()
  1668.          but stores the video configuration in an external structure for
  1669.          other MPLUS functions to reference.  The application program can
  1670.          reference the structure with the following declaration:
  1671.  
  1672.              extern  struct  videoconfig  _videoconfig;
  1673.  
  1674.  
  1675.          The videoconfig structure is supplied by Microsoft and detailed
  1676.          in "graph.h".  While it is possible to retrieve the video
  1677.          environment with Microsoft's _getvideoconfig(), referencing an
  1678.          external structure has the advantage of greater speed and less
  1679.          overhead.
  1680.  
  1681.          One other difference between mpsetvideomode() and
  1682.          _setvideomode() is that mpsetvideomode() removes any defined
  1683.          viewport or text window, whereas _setvideomode() does not.
  1684.  
  1685.          The manifest constants defining proper video modes are defined
  1686.          in Microsoft's "graph.h."  The table below summarizes them:
  1687.  
  1688.          Constant       Meaning
  1689.              ----------------------------------------------------------
  1690.          _DEFAULTMODE   Hardware default mode.
  1691.              _TEXTBW40      CGA Black & White, 40 column text mode.
  1692.              _TEXTC40       CGA Color, 40 column text mode.
  1693.              _TEXTBW80      CGA Black & White, 80 column text mode.
  1694.              _TEXTC80       CGA Color, 80 column text mode.
  1695.              _MRES4COLOR    CGA 4 Color, 320x200 pixels.
  1696.              _MRESNOCOLOR   CGA Black & White, 320x200 pixels.
  1697.              _HRESBW        CGA Black & White, 640x200 pixels.
  1698.              _TEXTMONO      Monochrome, 80 column text.
  1699.              _MRES16COLOR   EGA 16 color, 320x200 pixels.
  1700.              _HRES16COLOR   EGA 16 color, 640x200 pixels.
  1701.              _ERESNOCOLOR   EGA monochrome text.
  1702.              _ERESCOLOR     EGA 64 color, 640x350 pixels.
  1703.              _VRES2COLOR    VGA 2 color, 640x480 pixels.
  1704.              _VRES16COLOR   VGA 16 color, 640x480 pixels.
  1705.              _MRES256COLOR  VGA 256 color, 320x200 pixels.
  1706.  
  1707.  
  1708.  
  1709.  
  1710.  
  1711.  
  1712.  
  1713.          Copyright 1989-1991 by Michael Yam         Graphic Support  2-11
  1714.  
  1715.  
  1716.  
  1717.  
  1718.  
  1719.          MPLUS                                             mpsetvideomode
  1720.  
  1721.  
  1722.          The following additional modes are supported in Microsoft C 6.0:
  1723.  
  1724.              Constant       Meaning
  1725.              ----------------------------------------------------------
  1726.              _MAXRESMODE    Graphics mode with highest resolution.
  1727.              _MAXCOLORMODE  Graphics mode with most colors.
  1728.              _HERCMONO      Hercules 2 color, 720x348 pixels.
  1729.              _ORESCOLOR     Olivetti 1 of 16 colors, 640x400.
  1730.  
  1731.  
  1732.  
  1733.          RETURN VALUE
  1734.  
  1735.          This function returns a nonzero int if successful, a 0 on
  1736.          failure.
  1737.  
  1738.  
  1739.          EXAMPLE
  1740.  
  1741.          This example illustrates access to MPLUS' external structure.
  1742.  
  1743.          #include <graph.h>
  1744.          #include <gplus.h>
  1745.  
  1746.          extern struct videoconfig _videoconfig;
  1747.  
  1748.          main()
  1749.          {
  1750.              mpsetvideomode( _DEFAULTMODE );
  1751.  
  1752.              /*      reference a structure element
  1753.               */
  1754.              printf("video memory = %d KB", _videoconfig.memory);
  1755.          }
  1756.  
  1757.  
  1758.  
  1759.  
  1760.  
  1761.  
  1762.  
  1763.  
  1764.  
  1765.  
  1766.  
  1767.  
  1768.  
  1769.  
  1770.  
  1771.  
  1772.  
  1773.  
  1774.  
  1775.  
  1776.  
  1777.  
  1778.  
  1779.          Copyright 1989-1991 by Michael Yam         Graphic Support  2-12
  1780.  
  1781.  
  1782.  
  1783.  
  1784.  
  1785.          MPLUS                                                 mpwordwrap
  1786.  
  1787.  
  1788.          SUMMARY
  1789.  
  1790.          #include <graph.h>
  1791.          #include <gplus.h>
  1792.  
  1793.          int mpwordwrap(flag);
  1794.          char flag;                   wrap flag (0, 1, or 2)
  1795.  
  1796.  
  1797.          DESCRIPTION
  1798.  
  1799.          This function is used to enable or disable wordwrap when using
  1800.          mpouttext().  Normally, when text is being displayed to a
  1801.          graphic window, characters going beyond the right margin will
  1802.          wrap around and appear at the left margin on the next line.
  1803.          Enabling wordwrap will prevent a word from being split between
  1804.          margins; if there's no room on the line to display the entire
  1805.          word, the word will appear on the next line.
  1806.  
  1807.          A word is considered to be anything separated by spaces.
  1808.  
  1809.              flag           Meaning
  1810.              ----------------------------------------------------------
  1811.              0              wordwrap off (default)
  1812.              1              wordwrap on
  1813.              2              return status of wordwrap
  1814.  
  1815.  
  1816.          RETURN VALUE
  1817.  
  1818.          This function returns the previous setting of wordwrap.
  1819.  
  1820.  
  1821.          EXAMPLE
  1822.  
  1823.          See mpouttext().
  1824.  
  1825.  
  1826.  
  1827.  
  1828.  
  1829.  
  1830.  
  1831.  
  1832.  
  1833.  
  1834.  
  1835.  
  1836.  
  1837.  
  1838.  
  1839.  
  1840.  
  1841.  
  1842.  
  1843.  
  1844.  
  1845.          Copyright 1989-1991 by Michael Yam         Graphic Support  2-13
  1846.  
  1847.  
  1848.  
  1849.  
  1850.  
  1851.          MPLUS                                            GRAPHIC WINDOWS
  1852.  
  1853.  
  1854.  
  1855.  
  1856.  
  1857.  
  1858.          CHAPTER  3
  1859.          ----------
  1860.  
  1861.  
  1862.  
  1863.          GRAPHIC  WINDOWS
  1864.  
  1865.          In GRAPHICS.LIB text output could only appear in a "text window"
  1866.          while graphic output was restricted to the "graphic viewport."
  1867.          The MPLUS graphic window, also known as GWDW, is a hybrid object
  1868.          which can present both text and graphic output.  In addition a
  1869.          graphic window may be opened and closed, respectively saving and
  1870.          restoring the background area.
  1871.  
  1872.          The graphic window is achieved by overlaying a text window with
  1873.          a graphic viewport.  Note that a text window, being character
  1874.          oriented, must be byte aligned, whereas a graphic viewport can
  1875.          be pixel aligned.  Since precise overlaying is not always
  1876.          possible, the text window is always placed "inside" the graphic
  1877.          viewport.
  1878.  
  1879.          A graphic window is typically positioned and opened by
  1880.          specifying pixel coordinates (x,y); gwdwopen() performs this
  1881.          task.  Sometimes it may be more convenient to think and program
  1882.          in terms of text coordinates -- rows and columns -- especially
  1883.          when opening a window primarily to display text.  Use
  1884.          gwdwtopen() for those occasions; it accepts text coordinates.
  1885.          Regardless of the way a graphic window is opened, a GWDW will
  1886.          accept both text and graphic output.
  1887.  
  1888.          The number of graphic windows which can be opened at once
  1889.          depends upon available memory.  Graphic windows may overlap, but
  1890.          the programmer should not write to the one underneath.  Output,
  1891.          text or graphic, won't be clipped properly and will overwrite
  1892.          the contents of the upper window.  Problems also occur when
  1893.          closing the lower graphic window prior to closing the upper one:
  1894.          the lower one's background will be restored over the upper
  1895.          graphic window.  The management of overlapping windows may be
  1896.          avoided if graphic windows are arranged as tiles.
  1897.  
  1898.          There is one special form of graphic window known as the root
  1899.          window.  This root window behaves similarly to the standard
  1900.          graphic window, the difference being that it conserves memory by
  1901.          not saving the background area.  In effect the root window
  1902.          serves as the background screen.  Consequently, there should be
  1903.          only one root window in any given program and it must be opened
  1904.          before any graphic window is opened and closed after all graphic
  1905.          windows are closed.  Use of the root window is optional.  For
  1906.          more details, refer to the function descriptions of grootopen(),
  1907.          groottopen(), and grootclose().
  1908.  
  1909.  
  1910.  
  1911.          Copyright 1989-1991 by Michael Yam          Graphic Windows  3-1
  1912.  
  1913.  
  1914.  
  1915.  
  1916.  
  1917.          MPLUS                                            GRAPHIC WINDOWS
  1918.  
  1919.  
  1920.          No matter how a graphic window is opened -- whether with
  1921.          gwdwopen(), gwdwtopen(), grootopen(), or groottopen() -- you
  1922.          have the option of giving it one of four basic appearances: with
  1923.          a border, without a border, raised, or sunken.  While all four
  1924.          looks are fine for displaying information, the last two, because
  1925.          of their depth, are particularly useful for simulating push
  1926.          buttons.
  1927.  
  1928.          The graphic window's appearance is governed by three arguments:
  1929.  
  1930.              "border"       border type.
  1931.              "fg"           foreground & border color.
  1932.              "bg"           background or "fill" color.
  1933.  
  1934.  
  1935.              "border" Constant        Action
  1936.              ----------------------------------------------------------
  1937.              _GFILLINTERIOR           The graphic window is opened
  1938.                                       without a border.  The interior is
  1939.                                       filled with the color specified in
  1940.                                       "bg."
  1941.  
  1942.              _GBORDER                 The graphic window is opened with a
  1943.                                       border.  The border is displayed
  1944.                                       with the color specified in "fg"
  1945.                                       and the interior is filled with the
  1946.                                       color specified in "bg."
  1947.  
  1948.              _GRAISE                  The graphic window opened appears
  1949.                                       raised.  The borders along the left
  1950.                                       and top sides are WHITE, and the
  1951.                                       borders along the right and bottom
  1952.                                       sides are BLACK.  The interior is
  1953.                                       filled with the color specified in
  1954.                                       "bg."
  1955.  
  1956.              _GSINK                   The graphic window opened appears
  1957.                                       sunken.  The borders along the left
  1958.                                       and top sides are BLACK, and the
  1959.                                       borders along the right and bottom
  1960.                                       side are WHITE.  The interior is
  1961.                                       filled with the color specified in
  1962.                                       "bg."
  1963.  
  1964.  
  1965.          Concerning _GRAISE and _GSINK, if you specify the background
  1966.          color as WHITE or BLACK, the border colors automatically change
  1967.          to BRIGHTWHITE and GREY to ensure contrast.  Recommended
  1968.          background colors are GREY, WHITE, or BLUE.  Bright colors tend
  1969.          to wash out the 3-D effect.
  1970.  
  1971.  
  1972.  
  1973.  
  1974.  
  1975.  
  1976.  
  1977.          Copyright 1989-1991 by Michael Yam          Graphic Windows  3-2
  1978.  
  1979.  
  1980.  
  1981.  
  1982.  
  1983.          MPLUS                                            GRAPHIC WINDOWS
  1984.  
  1985.  
  1986.          A demo program and its source resides on the distribution disk
  1987.          as GWDWDEMO.EXE and GWDWDEMO.C, respectively.  It opens three
  1988.          windows, plots a sine and cosine wave, and finally closes all
  1989.          windows and exits.
  1990.  
  1991.          For an example of using a raised graphic window as a push
  1992.          button, see chapter 7, ginwindow().
  1993.  
  1994.  
  1995.          FUNCTION  SUMMARY
  1996.  
  1997.              Routine                  Purpose
  1998.              -----------------------------------------------------------
  1999.              grootclose()             Closes the root window.
  2000.              grootopen()              Opens the root window using graphic
  2001.                                       coordinates.
  2002.              groottopen()             Opens the root window using text
  2003.                                       coordinates.
  2004.              gwdwclose()              Closes a graphic window.
  2005.              gwdwclr()                Clears the graphic window.
  2006.              gwdwgetactv()            Gets the active graphic window.
  2007.              gwdwgetorg()             Gets the logical origin of a
  2008.                                       graphic window.
  2009.              gwdwopen()               Opens a graphic window using
  2010.                                       graphic coordinates.
  2011.              gwdwsetactv()            Makes a graphic window active.
  2012.              gwdwsetorg()             Sets the logical origin of a
  2013.                                       graphic window.
  2014.              gwdwtopen()              Opens a graphic window using text
  2015.                                       coordinates.
  2016.  
  2017.  
  2018.  
  2019.  
  2020.  
  2021.  
  2022.  
  2023.  
  2024.  
  2025.  
  2026.  
  2027.  
  2028.  
  2029.  
  2030.  
  2031.  
  2032.  
  2033.  
  2034.  
  2035.  
  2036.  
  2037.  
  2038.  
  2039.  
  2040.  
  2041.  
  2042.  
  2043.          Copyright 1989-1991 by Michael Yam          Graphic Windows  3-3
  2044.  
  2045.  
  2046.  
  2047.  
  2048.  
  2049.          MPLUS                                                 grootclose
  2050.  
  2051.  
  2052.          SUMMARY
  2053.  
  2054.          #include <graph.h>
  2055.          #include <gplus.h>
  2056.  
  2057.          int grootclose(gwptr);
  2058.          GWDW *gwptr;                 graphic window pointer
  2059.  
  2060.  
  2061.          DESCRIPTION
  2062.  
  2063.          The function grootclose() closes the root window.  Windows
  2064.          opened with the gwdwopen() or gwdwtopen() functions should be
  2065.          closed before closing the root window.
  2066.  
  2067.  
  2068.          RETURN VALUE
  2069.  
  2070.          This function returns a 0 if the root window is successfully
  2071.          closed, a -1 on failure.
  2072.  
  2073.  
  2074.  
  2075.  
  2076.  
  2077.  
  2078.  
  2079.  
  2080.  
  2081.  
  2082.  
  2083.  
  2084.  
  2085.  
  2086.  
  2087.  
  2088.  
  2089.  
  2090.  
  2091.  
  2092.  
  2093.  
  2094.  
  2095.  
  2096.  
  2097.  
  2098.  
  2099.  
  2100.  
  2101.  
  2102.  
  2103.  
  2104.  
  2105.  
  2106.  
  2107.  
  2108.  
  2109.          Copyright 1989-1991 by Michael Yam          Graphic Windows  3-4
  2110.  
  2111.  
  2112.  
  2113.  
  2114.  
  2115.          MPLUS                                                  grootopen
  2116.  
  2117.  
  2118.          SUMMARY
  2119.  
  2120.          #include <graph.h>
  2121.          #include <gscreen.h>
  2122.          #include <gplus.h>
  2123.  
  2124.          GWDW *grootopen(x1,y1,x2,y2,border,fg,bg);
  2125.          short x1,y1;                 upper left corner of window
  2126.          short x2,y2;                 lower right corner of window
  2127.          short border;                border flag
  2128.          short fg;                    window's foreground (and border) color.
  2129.          short bg;                    window's background color.
  2130.  
  2131.  
  2132.          DESCRIPTION
  2133.  
  2134.          The function grootopen() opens a root window using graphic
  2135.          coordinates.  A root window is special form of window; to save
  2136.          on memory requirements, it does not save the screen's
  2137.          background.  There should be only one root window in a given
  2138.          application and the root window should be opened prior to
  2139.          opening any other window via gwdwopen() or gwdwtopen().
  2140.  
  2141.          For graphic output, the upper left corner assumes logical origin
  2142.          (0,0), with x increasing from left to right, and y increasing
  2143.          from top to bottom. For text output, the upper left corner takes
  2144.          on the text coordinate of (1,1), with rows increasing from top
  2145.          to bottom, and columns increasing from left to right.  Text
  2146.          issued with outtext() moves from left to right with automatic
  2147.          wrap, and top to bottom with automatic text scrolling.
  2148.  
  2149.          The argument "border" may be one of four manifest constants:
  2150.  
  2151.              Constant                 Action
  2152.              ----------------------------------------------------------
  2153.              _GFILLINTERIOR           The graphic window is opened
  2154.                                       without a border.
  2155.              _GBORDER                 The graphic window is opened with a
  2156.                                       border.
  2157.              _GRAISE                  The graphic window appears raised.
  2158.              _GSINK                   The graphic window appears sunken.
  2159.  
  2160.  
  2161.          For more details concerning the border, refer to the chapter
  2162.          preface.
  2163.  
  2164.          Manifest constants for graphic EGA/VGA foreground and background
  2165.          colors are available in gscreen.h.
  2166.  
  2167.  
  2168.          RETURN VALUE
  2169.  
  2170.          This functions returns a GWDW pointer to the root window.  A
  2171.          NULL is returned if the root window could not be opened.
  2172.  
  2173.  
  2174.  
  2175.          Copyright 1989-1991 by Michael Yam          Graphic Windows  3-5
  2176.  
  2177.  
  2178.  
  2179.  
  2180.  
  2181.          MPLUS                                                 groottopen
  2182.  
  2183.  
  2184.          SUMMARY
  2185.  
  2186.          #include <graph.h>
  2187.          #include <gscreen.h>
  2188.          #include <gplus.h>
  2189.  
  2190.          GWDW *groottopen(r1,c1,r2,c2,border,fg,bg);
  2191.          short r1,c1;                 upper left corner of window
  2192.          short r2,c2;                 lower right corner of window
  2193.          short border;                border flag
  2194.          short fg;                    window's foreground (and border) color.
  2195.          short bg;                    window's background color.
  2196.  
  2197.  
  2198.          DESCRIPTION
  2199.  
  2200.          The function groottopen() opens a root window using text
  2201.          coordinates.  A root window is special form of window; to save
  2202.          on memory requirements, it does not save the screen's
  2203.          background.  There should be only one root window in a given
  2204.          application and the root window should be opened prior to
  2205.          opening any other window via the gwdwopen() or gwdwtopen().
  2206.  
  2207.          For graphic output, the upper left corner assumes logical origin
  2208.          (0,0), with x increasing from left to right, and y increasing
  2209.          from top to bottom.  For text output, the upper left corner
  2210.          takes on the text coordinate of (1,1), with rows increasing from
  2211.          top to bottom, and columns increasing from left to right.  Text
  2212.          issued with outtext() moves from left to right with automatic
  2213.          wrap, and top to bottom with automatic text scrolling.
  2214.  
  2215.          The argument "border" may be one of four manifest constants:
  2216.  
  2217.              Constant                 Action
  2218.              ----------------------------------------------------------
  2219.              _GFILLINTERIOR           The graphic window is opened
  2220.                                       without a border.
  2221.              _GBORDER                 The graphic window is opened with a
  2222.                                       border.
  2223.              _GRAISE                  The graphic window appears raised.
  2224.              _GSINK                   The graphic window appears sunken.
  2225.  
  2226.  
  2227.          For more details concerning the border, refer to the chapter
  2228.          preface.
  2229.  
  2230.          Manifest constants for graphic EGA/VGA foreground and background
  2231.          colors are available in gscreen.h.
  2232.  
  2233.  
  2234.          RETURN VALUE
  2235.  
  2236.          This functions returns a GWDW pointer to the root window.  A
  2237.          NULL is returned if the root window could not be opened.
  2238.  
  2239.  
  2240.  
  2241.          Copyright 1989-1991 by Michael Yam          Graphic Windows  3-6
  2242.  
  2243.  
  2244.  
  2245.  
  2246.  
  2247.          MPLUS                                                  gwdwclose
  2248.  
  2249.  
  2250.          SUMMARY
  2251.  
  2252.          #include <graph.h>
  2253.          #include <gplus.h>
  2254.  
  2255.          int gwdwclose(gwptr);
  2256.          GWDW *gwptr;                 graphic window pointer
  2257.  
  2258.  
  2259.          DESCRIPTION
  2260.  
  2261.          The function gwdwclose() closes a window opened by the
  2262.          gwdwopen() or gwdwtopen() function and restores the screen's
  2263.          background.  The window may be active or inactive.  If an active
  2264.          window is closed, this function makes no assumptions about the
  2265.          next active window.  Target windows for output are undefined
  2266.          until the programmer specifies the next active window with the
  2267.          gwdwsetactv() function.
  2268.  
  2269.  
  2270.          RETURN VALUE
  2271.  
  2272.          This function returns a 0 if the window is successfully closed,
  2273.          a -1 on failure.
  2274.  
  2275.  
  2276.  
  2277.  
  2278.  
  2279.  
  2280.  
  2281.  
  2282.  
  2283.  
  2284.  
  2285.  
  2286.  
  2287.  
  2288.  
  2289.  
  2290.  
  2291.  
  2292.  
  2293.  
  2294.  
  2295.  
  2296.  
  2297.  
  2298.  
  2299.  
  2300.  
  2301.  
  2302.  
  2303.  
  2304.  
  2305.  
  2306.  
  2307.          Copyright 1989-1991 by Michael Yam          Graphic Windows  3-7
  2308.  
  2309.  
  2310.  
  2311.  
  2312.  
  2313.          MPLUS                                                    gwdwclr
  2314.  
  2315.  
  2316.          SUMMARY
  2317.  
  2318.          #include <graph.h>
  2319.          #include <gplus.h>
  2320.  
  2321.          gwdwclr(gwptr);
  2322.          GWDW *gwptr;                 graphic window pointer
  2323.  
  2324.  
  2325.          DESCRIPTION
  2326.  
  2327.          The function gwdwclr() clears the window specified by "gwptr"
  2328.          using the window's background attribute.
  2329.  
  2330.          For text output, the upper left corner takes on the text
  2331.          coordinate of (1,1), with rows increasing from top to bottom,
  2332.          and columns increasing from left to right.  For graphic output,
  2333.          any logical origin in effect (set by the gwdwsetorg() function)
  2334.          is cleared.  The upper left corner assumes logical origin (0,0),
  2335.          with x increasing from left to right, and y increasing from top
  2336.          to bottom.
  2337.  
  2338.  
  2339.          RETURN VALUE
  2340.  
  2341.          None.
  2342.  
  2343.  
  2344.  
  2345.  
  2346.  
  2347.  
  2348.  
  2349.  
  2350.  
  2351.  
  2352.  
  2353.  
  2354.  
  2355.  
  2356.  
  2357.  
  2358.  
  2359.  
  2360.  
  2361.  
  2362.  
  2363.  
  2364.  
  2365.  
  2366.  
  2367.  
  2368.  
  2369.  
  2370.  
  2371.  
  2372.  
  2373.          Copyright 1989-1991 by Michael Yam          Graphic Windows  3-8
  2374.  
  2375.  
  2376.  
  2377.  
  2378.  
  2379.          MPLUS                                                gwdwgetactv
  2380.  
  2381.  
  2382.          SUMMARY
  2383.  
  2384.          #include <graph.h>
  2385.          #include <gplus.h>
  2386.  
  2387.          GWDW *gwdwgetactv(void);
  2388.  
  2389.  
  2390.          DESCRIPTION
  2391.  
  2392.          While several windows may be opened at once, only one can be
  2393.          active for output at any given moment.  The gwdwgetactv()
  2394.          function will get the active, or current, window.
  2395.  
  2396.  
  2397.          RETURN VALUE
  2398.  
  2399.          This function returns a GWDW pointer to the current window.  If
  2400.          no windows are opened, a NULL is returned.
  2401.  
  2402.  
  2403.  
  2404.  
  2405.  
  2406.  
  2407.  
  2408.  
  2409.  
  2410.  
  2411.  
  2412.  
  2413.  
  2414.  
  2415.  
  2416.  
  2417.  
  2418.  
  2419.  
  2420.  
  2421.  
  2422.  
  2423.  
  2424.  
  2425.  
  2426.  
  2427.  
  2428.  
  2429.  
  2430.  
  2431.  
  2432.  
  2433.  
  2434.  
  2435.  
  2436.  
  2437.  
  2438.  
  2439.          Copyright 1989-1991 by Michael Yam          Graphic Windows  3-9
  2440.  
  2441.  
  2442.  
  2443.  
  2444.  
  2445.          MPLUS                                                 gwdwgetorg
  2446.  
  2447.  
  2448.          SUMMARY
  2449.  
  2450.          #include <graph.h>
  2451.          #include <gplus.h>
  2452.  
  2453.          void gwdwgetorg(gwptr,x0,y0);
  2454.          GWDW *gwptr;                 graphic window pointer
  2455.          short *x0,*y0;               origin of graphic window
  2456.  
  2457.  
  2458.          DESCRIPTION
  2459.  
  2460.          The gwdwgetorg() gets the logical origin of the graphic window
  2461.          specified by "gwptr."  The origin is returned in the arguments
  2462.          *x and *y.  It is a logical point with gwptr() as the frame
  2463.          of reference.
  2464.  
  2465.  
  2466.          RETURN VALUE
  2467.  
  2468.          None.
  2469.  
  2470.  
  2471.  
  2472.  
  2473.  
  2474.  
  2475.  
  2476.  
  2477.  
  2478.  
  2479.  
  2480.  
  2481.  
  2482.  
  2483.  
  2484.  
  2485.  
  2486.  
  2487.  
  2488.  
  2489.  
  2490.  
  2491.  
  2492.  
  2493.  
  2494.  
  2495.  
  2496.  
  2497.  
  2498.  
  2499.  
  2500.  
  2501.  
  2502.  
  2503.  
  2504.  
  2505.          Copyright 1989-1991 by Michael Yam         Graphic Windows  3-10
  2506.  
  2507.  
  2508.  
  2509.  
  2510.  
  2511.          MPLUS                                                   gwdwopen
  2512.  
  2513.  
  2514.          SUMMARY
  2515.  
  2516.          #include <graph.h>
  2517.          #include <gscreen.h>
  2518.          #include <gplus.h>
  2519.  
  2520.          GWDW *gwdwopen(x1,y1,x2,y2,border,fg,bg);
  2521.          short x1,y1;                 upper left corner of window
  2522.          short x2,y2;                 lower right corner of window
  2523.          short border;                border flag
  2524.          short fg;                    foreground (and border) color
  2525.          short bg;                    background color
  2526.  
  2527.  
  2528.          DESCRIPTION
  2529.  
  2530.          The function gwdwopen() opens a graphic window for text and
  2531.          graphic output using graphic coordinates.  The screen's
  2532.          background is saved and will be restored when the window is
  2533.          closed with gwdwclose().
  2534.  
  2535.          For graphic output, the upper left corner assumes logical origin
  2536.          (0,0), with x increasing from left to right, and y increasing
  2537.          from top to bottom.  For text output, the upper left corner
  2538.          takes on the text coordinate of (1,1), with rows increasing from
  2539.          top to bottom, and columns increasing from left to right.  Text
  2540.          issued with outtext() moves from left to right with automatic
  2541.          wrap, and top to bottom with automatic text scrolling.
  2542.  
  2543.          The argument "border" may be one of four manifest constants:
  2544.  
  2545.              Constant                 Action
  2546.              ----------------------------------------------------------
  2547.              _GFILLINTERIOR           The graphic window is opened
  2548.                                       without a border.
  2549.              _GBORDER                 The graphic window is opened with a
  2550.                                       border.
  2551.              _GRAISE                  The graphic window appears raised.
  2552.              _GSINK                   The graphic window appears sunken.
  2553.  
  2554.  
  2555.          For more details concerning the border, refer to the chapter
  2556.          preface.
  2557.  
  2558.          Manifest constants for graphic EGA/VGA foreground and background
  2559.          colors are available in gscreen.h.
  2560.  
  2561.  
  2562.  
  2563.  
  2564.  
  2565.  
  2566.  
  2567.  
  2568.  
  2569.  
  2570.  
  2571.          Copyright 1989-1991 by Michael Yam         Graphic Windows  3-11
  2572.  
  2573.  
  2574.  
  2575.  
  2576.  
  2577.          MPLUS                                                   gwdwopen
  2578.  
  2579.  
  2580.          The window coordinates (x1,y1) and (x2,y2) are physical ones. An
  2581.          absolute frame of reference precludes having windows opened
  2582.          inside windows opened inside windows... and that saves a
  2583.          programmer aspirin.
  2584.  
  2585.  
  2586.          RETURN VALUE
  2587.  
  2588.          This function returns a GWDW pointer.  A NULL is returned if the
  2589.          window could not be opened.
  2590.  
  2591.  
  2592.  
  2593.  
  2594.  
  2595.  
  2596.  
  2597.  
  2598.  
  2599.  
  2600.  
  2601.  
  2602.  
  2603.  
  2604.  
  2605.  
  2606.  
  2607.  
  2608.  
  2609.  
  2610.  
  2611.  
  2612.  
  2613.  
  2614.  
  2615.  
  2616.  
  2617.  
  2618.  
  2619.  
  2620.  
  2621.  
  2622.  
  2623.  
  2624.  
  2625.  
  2626.  
  2627.  
  2628.  
  2629.  
  2630.  
  2631.  
  2632.  
  2633.  
  2634.  
  2635.  
  2636.  
  2637.          Copyright 1989-1991 by Michael Yam         Graphic Windows  3-12
  2638.  
  2639.  
  2640.  
  2641.  
  2642.  
  2643.          MPLUS                                                gwdwsetactv
  2644.  
  2645.  
  2646.          SUMMARY
  2647.  
  2648.          #include <graph.h>
  2649.          #include <gplus.h>
  2650.  
  2651.          int gwdwsetactv(gwptr);
  2652.          GWDW *gwptr;                 graphic window pointer
  2653.  
  2654.  
  2655.          DESCRIPTION
  2656.  
  2657.          The function gwdwsetactv() makes the window specified by "gwptr"
  2658.          the active, or current, window.  The window will be available
  2659.          for graphic and text output.  Since each graphic window retains
  2660.          information about the location of its text and graphic cursor,
  2661.          along with its logical origin coordinates, window output resumes
  2662.          at the correct positions.
  2663.  
  2664.  
  2665.          RETURN VALUE
  2666.  
  2667.          This function returns a 0 if successful, a -1 on failure.
  2668.  
  2669.  
  2670.  
  2671.  
  2672.  
  2673.  
  2674.  
  2675.  
  2676.  
  2677.  
  2678.  
  2679.  
  2680.  
  2681.  
  2682.  
  2683.  
  2684.  
  2685.  
  2686.  
  2687.  
  2688.  
  2689.  
  2690.  
  2691.  
  2692.  
  2693.  
  2694.  
  2695.  
  2696.  
  2697.  
  2698.  
  2699.  
  2700.  
  2701.  
  2702.  
  2703.          Copyright 1989-1991 by Michael Yam         Graphic Windows  3-13
  2704.  
  2705.  
  2706.  
  2707.  
  2708.  
  2709.          MPLUS                                                 gwdwsetorg
  2710.  
  2711.  
  2712.          SUMMARY
  2713.  
  2714.          #include <graph.h>
  2715.          #include <gplus.h>
  2716.  
  2717.          void gwdwsetorg(gwptr,x0,y0);
  2718.          GWDW *gwptr;                 graphic window pointer
  2719.          short x0,y0;                 logical origin
  2720.  
  2721.  
  2722.          DESCRIPTION
  2723.  
  2724.          When a graphic window is opened with the function gwdwopen(),
  2725.          the logical origin (0,0) is set to its upper left corner.  This
  2726.          may be changed with the gwdwsetorg() function which moves the
  2727.          logical origin (0,0) to the logical point ("x0","y0").  "gwptr"
  2728.          is our frame of reference.
  2729.  
  2730.  
  2731.          RETURN VALUE
  2732.  
  2733.          None.
  2734.  
  2735.  
  2736.  
  2737.  
  2738.  
  2739.  
  2740.  
  2741.  
  2742.  
  2743.  
  2744.  
  2745.  
  2746.  
  2747.  
  2748.  
  2749.  
  2750.  
  2751.  
  2752.  
  2753.  
  2754.  
  2755.  
  2756.  
  2757.  
  2758.  
  2759.  
  2760.  
  2761.  
  2762.  
  2763.  
  2764.  
  2765.  
  2766.  
  2767.  
  2768.  
  2769.          Copyright 1989-1991 by Michael Yam         Graphic Windows  3-14
  2770.  
  2771.  
  2772.  
  2773.  
  2774.  
  2775.          MPLUS                                                  gwdwtopen
  2776.  
  2777.  
  2778.          SUMMARY
  2779.  
  2780.          #include <graph.h>
  2781.          #include <gscreen.h>
  2782.          #include <gplus.h>
  2783.  
  2784.          GWDW *gwdwtopen(r1,c1,r2,c2,border,fg,bg);
  2785.          short r1,c1;                 upper left corner of window
  2786.          short r2,c2;                 lower right corner of window
  2787.          short border;                border flag
  2788.          short fg;                    foreground (and border) color
  2789.          short bg;                    background color
  2790.  
  2791.  
  2792.          DESCRIPTION
  2793.  
  2794.          The function gwdwtopen() opens a graphic window for text and
  2795.          graphic output using text coordinates.  The screen's background
  2796.          is saved and will be restored when the window is closed with
  2797.          gwdwclose().
  2798.  
  2799.          For graphic output, the upper left corner assumes logical origin
  2800.          (0,0), with x increasing from left to right, and y increasing
  2801.          from top to bottom. For text output, the upper left corner takes
  2802.          on the text coordinate of (1,1), with rows increasing from top
  2803.          to bottom, and columns increasing from left to right.  Text
  2804.          issued with outtext() moves from left to right with automatic
  2805.          wrap, and top to bottom with automatic text scroll.
  2806.  
  2807.          The argument "border" may be one of four manifest constants:
  2808.  
  2809.              Constant                 Action
  2810.              ----------------------------------------------------------
  2811.              _GFILLINTERIOR           The graphic window is opened
  2812.                                       without a border.
  2813.              _GBORDER                 The graphic window is opened with a
  2814.                                       border.
  2815.              _GRAISE                  The graphic window appears raised.
  2816.              _GSINK                   The graphic window appears sunken.
  2817.  
  2818.  
  2819.          For more details concerning the border, refer to the chapter
  2820.          preface.
  2821.  
  2822.          Manifest constants for graphic EGA/VGA foreground and background
  2823.          colors are available in gscreen.h.
  2824.  
  2825.          The window coordinates (r1,c1) and (r2,c2) are physical
  2826.          ones.  An absolute frame of reference precludes having windows
  2827.          opened inside windows opened inside windows.
  2828.  
  2829.  
  2830.  
  2831.  
  2832.  
  2833.  
  2834.  
  2835.          Copyright 1989-1991 by Michael Yam         Graphic Windows  3-15
  2836.  
  2837.  
  2838.  
  2839.  
  2840.  
  2841.          MPLUS                                                  gwdwtopen
  2842.  
  2843.  
  2844.          RETURN VALUE
  2845.  
  2846.          This function returns a GWDW pointer.  A NULL is returned if the
  2847.          window could not be opened.
  2848.  
  2849.  
  2850.  
  2851.  
  2852.  
  2853.  
  2854.  
  2855.  
  2856.  
  2857.  
  2858.  
  2859.  
  2860.  
  2861.  
  2862.  
  2863.  
  2864.  
  2865.  
  2866.  
  2867.  
  2868.  
  2869.  
  2870.  
  2871.  
  2872.  
  2873.  
  2874.  
  2875.  
  2876.  
  2877.  
  2878.  
  2879.  
  2880.  
  2881.  
  2882.  
  2883.  
  2884.  
  2885.  
  2886.  
  2887.  
  2888.  
  2889.  
  2890.  
  2891.  
  2892.  
  2893.  
  2894.  
  2895.  
  2896.  
  2897.  
  2898.  
  2899.  
  2900.  
  2901.          Copyright 1989-1991 by Michael Yam         Graphic Windows  3-16
  2902.  
  2903.  
  2904.  
  2905.  
  2906.  
  2907.          MPLUS                                           GRAPHIC DIALOGUE
  2908.  
  2909.  
  2910.  
  2911.  
  2912.  
  2913.  
  2914.  
  2915.          CHAPTER  4
  2916.          ----------
  2917.  
  2918.  
  2919.  
  2920.          GRAPHIC  DIALOGUE
  2921.  
  2922.          A dialogue box presents information in a graphic window and
  2923.          solicits a response from the user.  The user response can be
  2924.          from either the mouse or keyboard.  There are three classes of
  2925.          dialogue boxes: information, warning, and error.  Any may be
  2926.          presented with the predefined prompts "Okay", "Okay/Cancel", and
  2927.          "Yes/No".
  2928.  
  2929.          The location of the box on screen is defined by the following
  2930.          relationships:
  2931.  
  2932.              row1 = _videoconfig.numtextrows / 4;
  2933.              row2 = row1 + 6;
  2934.              col1 = _videoconfig.numtextcols / 4;
  2935.              col2 = col1 * 3;
  2936.  
  2937.          Warning and error boxes are displayed with a title and have room
  2938.          for three rows of text.  The information box, having no title,
  2939.          can present four rows of text.  As for characters per line, high
  2940.          resolution graphics allows 40 while medium resolution graphics
  2941.          provides 20.  When writing to the dialogue box, text will wrap.
  2942.          Scrolling is not supported in a dialogue box; thus it is
  2943.          important not to exceed three rows of text in a warning or error
  2944.          box and four rows of text in an information box.
  2945.  
  2946.          A demo program and its source resides on the distribution disk
  2947.          as GDDEMO.EXE and GDDEMO.C, respectively.  They illustrate the
  2948.          calls to all three classes of dialogue box.
  2949.  
  2950.          Dialogue functions are prefixed with "gd."
  2951.  
  2952.  
  2953.  
  2954.  
  2955.  
  2956.  
  2957.  
  2958.  
  2959.  
  2960.  
  2961.  
  2962.  
  2963.  
  2964.  
  2965.  
  2966.  
  2967.          Copyright 1989-1991 by Michael Yam         Graphic Dialogue  4-1
  2968.  
  2969.  
  2970.  
  2971.  
  2972.  
  2973.          MPLUS                                            Graphic Dialgue
  2974.  
  2975.  
  2976.  
  2977.  
  2978.          FUNCTION  SUMMARY
  2979.  
  2980.              Routine                  Purpose
  2981.              ----------------------------------------------------------
  2982.              gdclose()                Closes a dialogue box.
  2983.              gdialog()                Opens a dialogue box.
  2984.              gdprompt()               Solicits a response from the user.
  2985.              gdwrite()                Outputs text to dialogue box.
  2986.  
  2987.  
  2988.  
  2989.  
  2990.  
  2991.  
  2992.  
  2993.  
  2994.  
  2995.  
  2996.  
  2997.  
  2998.  
  2999.  
  3000.  
  3001.  
  3002.  
  3003.  
  3004.  
  3005.  
  3006.  
  3007.  
  3008.  
  3009.  
  3010.  
  3011.  
  3012.  
  3013.  
  3014.  
  3015.  
  3016.  
  3017.  
  3018.  
  3019.  
  3020.  
  3021.  
  3022.  
  3023.  
  3024.  
  3025.  
  3026.  
  3027.  
  3028.  
  3029.  
  3030.  
  3031.  
  3032.  
  3033.          Copyright 1989-1991 by Michael Yam         Graphic Dialogue  4-2
  3034.  
  3035.  
  3036.  
  3037.  
  3038.  
  3039.          MPLUS                                                    gdclose
  3040.  
  3041.  
  3042.          SUMMARY
  3043.  
  3044.          #include <gplus.h>
  3045.  
  3046.          void gdclose(void);
  3047.  
  3048.  
  3049.          DESCRIPTION
  3050.  
  3051.          The gdclose() function closes the dialog box opened by
  3052.          gdialog().  Successful closure restores the screen's background.
  3053.  
  3054.  
  3055.          RETURN VALUE
  3056.  
  3057.          None.
  3058.  
  3059.  
  3060.  
  3061.  
  3062.  
  3063.  
  3064.  
  3065.  
  3066.  
  3067.  
  3068.  
  3069.  
  3070.  
  3071.  
  3072.  
  3073.  
  3074.  
  3075.  
  3076.  
  3077.  
  3078.  
  3079.  
  3080.  
  3081.  
  3082.  
  3083.  
  3084.  
  3085.  
  3086.  
  3087.  
  3088.  
  3089.  
  3090.  
  3091.  
  3092.  
  3093.  
  3094.  
  3095.  
  3096.  
  3097.  
  3098.  
  3099.          Copyright 1989-1991 by Michael Yam         Graphic Dialogue  4-3
  3100.  
  3101.  
  3102.  
  3103.  
  3104.  
  3105.          MPLUS                                                    gdialog
  3106.  
  3107.  
  3108.          SUMMARY
  3109.  
  3110.          #include <graph.h>
  3111.          #include <gplus.h>
  3112.  
  3113.          int gdialog(dialtype,clickoption);
  3114.          char dialtype;               dialogue type: information,
  3115.                                       warning, error
  3116.          char clickoption;            response options: "okay",
  3117.                                       "okay/cancel", "yes/no"
  3118.  
  3119.  
  3120.          DESCRIPTION
  3121.  
  3122.          The gdialog() function opens a window which interacts with the
  3123.          user.  Really a canned gwdwtopen() function, gdialog() opens up
  3124.          a graphic window in the middle of the screen with colors
  3125.          determined by the parameter "dialtype" and mouse clicking options
  3126.          determined by the parameter "clickoption".  The colors described
  3127.          below apply only to EGA and VGA 16 color modes.
  3128.  
  3129.          "dialtype" may be any one of the following manifest constants
  3130.          (defined in gplus.h):
  3131.  
  3132.  
  3133.              Constant                 Meaning
  3134.              ----------------------------------------------------------
  3135.              GDINFORM                 An information box with a blue
  3136.                                       border.  Text appears in blue on a
  3137.                                       white background.
  3138.  
  3139.              GDWARN                   A warning box with a yellow border.
  3140.                                       Text appears in yellow on a black
  3141.                                       background.
  3142.  
  3143.              GDERROR                  An error box with a red border.
  3144.                                       Text appears in red on a black
  3145.                                       background.
  3146.  
  3147.  
  3148.          "clickoption" may be any one of the following manifest constants
  3149.          (defined in gplus.h):
  3150.  
  3151.              Constant                 Meaning
  3152.              ----------------------------------------------------------
  3153.              GDOKAY                   A mouse clicking region of "OKAY".
  3154.  
  3155.              GDOKCAN                  Two mouse clicking regions, the
  3156.                                       first with "OKAY", the second with
  3157.                                       "CANCEL".
  3158.  
  3159.              GDYESNO                  Two mouse clicking regions, the
  3160.                                       first with "YES", the second with
  3161.                                       "NO".
  3162.  
  3163.  
  3164.  
  3165.          Copyright 1989-1991 by Michael Yam         Graphic Dialogue  4-4
  3166.  
  3167.  
  3168.  
  3169.  
  3170.  
  3171.          MPLUS                                                    gdialog
  3172.  
  3173.  
  3174.          RETURN VALUE
  3175.  
  3176.          This function returns a 0 if the dialog window was opened
  3177.          successfully, a -1 on error.
  3178.  
  3179.  
  3180.  
  3181.  
  3182.  
  3183.  
  3184.  
  3185.  
  3186.  
  3187.  
  3188.  
  3189.  
  3190.  
  3191.  
  3192.  
  3193.  
  3194.  
  3195.  
  3196.  
  3197.  
  3198.  
  3199.  
  3200.  
  3201.  
  3202.  
  3203.  
  3204.  
  3205.  
  3206.  
  3207.  
  3208.  
  3209.  
  3210.  
  3211.  
  3212.  
  3213.  
  3214.  
  3215.  
  3216.  
  3217.  
  3218.  
  3219.  
  3220.  
  3221.  
  3222.  
  3223.  
  3224.  
  3225.  
  3226.  
  3227.  
  3228.  
  3229.  
  3230.  
  3231.          Copyright 1989-1991 by Michael Yam         Graphic Dialogue  4-5
  3232.  
  3233.  
  3234.  
  3235.  
  3236.  
  3237.          MPLUS                                                   gdprompt
  3238.  
  3239.  
  3240.          SUMMARY
  3241.  
  3242.          #include <graph.h>
  3243.          #include <gplus.h>
  3244.  
  3245.          int gdprompt(void)
  3246.  
  3247.  
  3248.          DESCRIPTION
  3249.  
  3250.          The gdprompt() function waits for the user to select, with a
  3251.          mouse or keyboard, a prompt from the dialog box.  To select with
  3252.          the mouse, move the cursor to the clicking region and press the
  3253.          left button.  To select with the keyboard, press the key
  3254.          corresponding to the first character of the prompt.  For
  3255.          example, to select "Okay", press the letter "O".
  3256.  
  3257.          The keys "Enter" and "Esc" also work.  "Enter" would select
  3258.          "Yes" or "Okay", and "Esc" would select "No" or "Cancel."  If
  3259.          there were only one possible choice, "Okay", either key will
  3260.          make the selection.
  3261.  
  3262.  
  3263.          RETURN VALUE
  3264.  
  3265.          This function returns a 0 or 1 depending on the prompts
  3266.          available and the user response.
  3267.  
  3268.  
  3269.              Click Option Constant    Return Value   User Selection
  3270.              ----------------------------------------------------------
  3271.              GDOKAY                   0              okay
  3272.  
  3273.              GDOKCAN                  0              okay
  3274.                                       1              cancel
  3275.  
  3276.              GDYESNO                  0              yes
  3277.                                       1              no
  3278.  
  3279.  
  3280.  
  3281.  
  3282.  
  3283.  
  3284.  
  3285.  
  3286.  
  3287.  
  3288.  
  3289.  
  3290.  
  3291.  
  3292.  
  3293.  
  3294.  
  3295.  
  3296.  
  3297.          Copyright 1989-1991 by Michael Yam         Graphic Dialogue  4-6
  3298.  
  3299.  
  3300.  
  3301.  
  3302.  
  3303.          MPLUS                                                    gdwrite
  3304.  
  3305.  
  3306.          SUMMARY
  3307.  
  3308.          #include <graph.h>
  3309.          #include <gplus.h>
  3310.  
  3311.          int gdwrite(text);
  3312.          char *text;                  null terminated string
  3313.  
  3314.  
  3315.          DESCRIPTION
  3316.  
  3317.          The gdwrite() function outputs "text" to the dialogue box.  A
  3318.          warning or error dialogue box has room for three lines of text;
  3319.          an information box allows four lines of text.  Lines may be up
  3320.          to 40 characters long in high resolution graphics mode, and 20
  3321.          characters long in medium resolution.
  3322.  
  3323.          Text wrap is supported but scrolling is not.  Consequently, it
  3324.          is important not to exceed the number of rows allowed by a
  3325.          particular dialog box.
  3326.  
  3327.  
  3328.          RETURN VALUE
  3329.  
  3330.          This function returns a 0 if successful, a -1 on error.
  3331.  
  3332.  
  3333.  
  3334.  
  3335.  
  3336.  
  3337.  
  3338.  
  3339.  
  3340.  
  3341.  
  3342.  
  3343.  
  3344.  
  3345.  
  3346.  
  3347.  
  3348.  
  3349.  
  3350.  
  3351.  
  3352.  
  3353.  
  3354.  
  3355.  
  3356.  
  3357.  
  3358.  
  3359.  
  3360.  
  3361.  
  3362.  
  3363.          Copyright 1989-1991 by Michael Yam         Graphic Dialogue  4-7
  3364.  
  3365.  
  3366.  
  3367.  
  3368.  
  3369.          MPLUS                                              GRAPHIC IMAGE
  3370.  
  3371.  
  3372.  
  3373.  
  3374.  
  3375.  
  3376.  
  3377.          CHAPTER  5
  3378.          ----------
  3379.  
  3380.  
  3381.  
  3382.          GRAPHIC  IMAGE
  3383.  
  3384.          The functions provided here deal with images -- picking them up,
  3385.          sliding them across the screen, and putting them down.  Of
  3386.          course functions which deal with the screen correctly must make
  3387.          sure that the mouse cursor does not interfere with the image;
  3388.          these functions hide the mouse cursor before reading or updating
  3389.          the screen, and restores the mouse cursor when done.  You will
  3390.          have to manage the mouse cursor yourself when using any of
  3391.          Microsoft's output or drawing functions.
  3392.  
  3393.          Also described here are two functions used for rubberbanding:
  3394.          xorpt() and xorline().  Consider a line where one end point is
  3395.          anchored, and the other end point is variable and designated by
  3396.          the mouse cursor.  As the user slides the mouse around, the old
  3397.          line is erased and a new line is drawn to the new end point; all
  3398.          this happens without the destruction of the background screen.
  3399.          The effect is a line that moves, stretches, compresses, and
  3400.          pretty much behaves like a rubberband.  Rubberbanding is common
  3401.          in paint programs and computer-aided design applications.
  3402.  
  3403.          Microsoft C 6.0 users: a faster alternative to xorline() would
  3404.          be to use _setwritemode(_GXOR) with _moveto() and _lineto().
  3405.  
  3406.          Moving objects and rubberbanding are made possible with the
  3407.          "exclusive or," also known as XOR.  A wonderful little operator,
  3408.          XOR behaves as follows:
  3409.  
  3410.              Table 5-1
  3411.              XOR behavior
  3412.              ---------------------------
  3413.              Bit A     Bit B     A XOR B
  3414.              1         1         0
  3415.              1         0         1
  3416.              0         1         1
  3417.              0         0         0
  3418.  
  3419.  
  3420.          When an image is XORed onto the screen, it appears on the screen
  3421.          and gets combined with the background.  When the image is XORed
  3422.          onto the screen twice, the image disappears and the background
  3423.          is restored.
  3424.  
  3425.  
  3426.  
  3427.  
  3428.  
  3429.          Copyright 1989-1991 by Michael Yam            Graphic Image  5-1
  3430.  
  3431.  
  3432.  
  3433.  
  3434.  
  3435.          MPLUS                                              GRAPHIC IMAGE
  3436.  
  3437.  
  3438.          FUNCTION SUMMARY
  3439.  
  3440.              Routine                  Purpose
  3441.              ----------------------------------------------------------
  3442.              gpickup()                Allocates memory and saves a
  3443.                                       rectangular screen image to it.
  3444.              gputdown()               Restores an image to the screen and
  3445.                                       frees allocated memory.
  3446.              loghighlite()            Highlights an image specified by
  3447.                                       logical coordinates.
  3448.              mpgetimage()             Saves a rectangular screen image.
  3449.              mpputimage()             Restores an image to screen.
  3450.              physhighlite()           Highlights an image specified by
  3451.                                       physical coordinates.
  3452.              xorline()                Draws a line using the XOR
  3453.                                       operator.
  3454.              xorpt()                  Draws a point using the XOR
  3455.                                       operator.
  3456.  
  3457.  
  3458.  
  3459.  
  3460.  
  3461.  
  3462.  
  3463.  
  3464.  
  3465.  
  3466.  
  3467.  
  3468.  
  3469.  
  3470.  
  3471.  
  3472.  
  3473.  
  3474.  
  3475.  
  3476.  
  3477.  
  3478.  
  3479.  
  3480.  
  3481.  
  3482.  
  3483.  
  3484.  
  3485.  
  3486.  
  3487.  
  3488.  
  3489.  
  3490.  
  3491.  
  3492.  
  3493.  
  3494.  
  3495.          Copyright 1989-1991 by Michael Yam            Graphic Image  5-2
  3496.  
  3497.  
  3498.  
  3499.  
  3500.  
  3501.          MPLUS                                                    gpickup
  3502.  
  3503.  
  3504.          SUMMARY
  3505.  
  3506.          #include <graph.h>
  3507.          #include <gplus.h>
  3508.  
  3509.          char *gpickup(x1,y1,x2,y2);
  3510.          short x1,y1;                 upper left corner of image to pickup
  3511.          short x2,y2;                 lower right corner of image to pickup
  3512.  
  3513.  
  3514.          DESCRIPTION
  3515.  
  3516.          The gpickup() function grabs into memory the portion of the
  3517.          video buffer specified by the rectangle with the logical
  3518.          coordinates (x1,y1) and (x2,y2).  This function is similar to
  3519.          Microsoft's _getimage() function but higher in level; the memory
  3520.          required to save the image is calculated and dynamically
  3521.          allocated.
  3522.  
  3523.          Use gputdown() to put down the image and free the allocated
  3524.          memory.
  3525.  
  3526.  
  3527.          RETURN VALUE
  3528.  
  3529.          This function returns to char pointer to an image buffer.  If
  3530.          the image could not be picked up, probably due to insufficient
  3531.          memory, the char pointer will be NULL.
  3532.  
  3533.  
  3534.  
  3535.  
  3536.  
  3537.  
  3538.  
  3539.  
  3540.  
  3541.  
  3542.  
  3543.  
  3544.  
  3545.  
  3546.  
  3547.  
  3548.  
  3549.  
  3550.  
  3551.  
  3552.  
  3553.  
  3554.  
  3555.  
  3556.  
  3557.  
  3558.  
  3559.  
  3560.  
  3561.          Copyright 1989-1991 by Michael Yam            Graphic Image  5-3
  3562.  
  3563.  
  3564.  
  3565.  
  3566.  
  3567.          MPLUS                                                    gpickup
  3568.  
  3569.  
  3570.          EXAMPLE
  3571.  
  3572.          The example below slides a box across the screen.
  3573.  
  3574.          #include <graph.h>
  3575.          #include <gscreen.h>
  3576.          #include <gplus.h>
  3577.  
  3578.          extern struct videoconfig _videoconfig;
  3579.  
  3580.          main()
  3581.          {
  3582.              char *image;
  3583.              short x1, y1, x2, y2;
  3584.              short x, xwidth, xmax;
  3585.  
  3586.              mpsetvideomode( _ERESCOLOR );
  3587.  
  3588.              x1 = _videoconfig.numxpixels/2 - 10;
  3589.              y1 = _videoconfig.numypixels/2 - 10;
  3590.              x2 = _videoconfig.numxpixels/2 + 10;
  3591.              y2 = _videoconfig.numypixels/2 + 10;
  3592.              xwidth = x2-x1;
  3593.  
  3594.              _rectangle( _GFILLINTERIOR, x1, y1, x2, y2 );
  3595.              image = gpickup( x1, y1, x2, y2 );
  3596.              _clearscreen( _GCLEARSCREEN );
  3597.  
  3598.              xmax = _videoconfig.numxpixels-xwidth-1;
  3599.              for( x=0; x<xmax; ++x )
  3600.              {
  3601.                  mpputimage( x, y1, image, _GXOR );
  3602.                  mpputimage( x, y1, image, _GXOR );
  3603.              }
  3604.              gputdown( x, y1, image, _GPSET );
  3605.  
  3606.              printf("Press a key");
  3607.              getch();
  3608.  
  3609.              mpsetvideomode( _DEFAULTMODE );
  3610.              return 0;
  3611.          }
  3612.  
  3613.  
  3614.  
  3615.  
  3616.  
  3617.  
  3618.  
  3619.  
  3620.  
  3621.  
  3622.  
  3623.  
  3624.  
  3625.  
  3626.  
  3627.          Copyright 1989-1991 by Michael Yam            Graphic Image  5-4
  3628.  
  3629.  
  3630.  
  3631.  
  3632.  
  3633.          MPLUS                                                   gputdown
  3634.  
  3635.  
  3636.          SUMMARY
  3637.  
  3638.          #include <graph.h>
  3639.          #include <gplus.h>
  3640.  
  3641.          int gputdown(x1,y1,image,action)
  3642.          short x1,y1;                 upper left coordinate of image
  3643.          char *image;                 pointer to image buffer
  3644.          short action;                interaction with existing screen image
  3645.  
  3646.  
  3647.          DESCRIPTION
  3648.  
  3649.          The gputdown() function puts an image down to screen.  The image
  3650.          must have been picked up by gpickup().
  3651.  
  3652.          The "action" parameter determines the interaction with the
  3653.          existing screen image.  Manifest constants are defined in
  3654.          graph.h and described in the Microsoft documentation for the
  3655.          _putimage() function.  The table below summarizes the available
  3656.          logical operations:
  3657.  
  3658.              Constant                 Meaning
  3659.              ----------------------------------------------------------
  3660.              _GAND                    ANDs the image to screen.
  3661.              _GOR                     ORs the image to screen.
  3662.              _GPRESET                 NOTs the image to screen.
  3663.              _GPSET                   Copies the image to screen.
  3664.              _GXOR                    XORs the image to screen.
  3665.  
  3666.  
  3667.          RETURN VALUE
  3668.  
  3669.          This function returns a 0 if the image was put down successful,
  3670.          a -1 on failure.
  3671.  
  3672.          EXAMPLE
  3673.  
  3674.          See gpickup().
  3675.  
  3676.  
  3677.  
  3678.  
  3679.  
  3680.  
  3681.  
  3682.  
  3683.  
  3684.  
  3685.  
  3686.  
  3687.  
  3688.  
  3689.  
  3690.  
  3691.  
  3692.  
  3693.          Copyright 1989-1991 by Michael Yam            Graphic Image  5-5
  3694.  
  3695.  
  3696.  
  3697.  
  3698.  
  3699.          MPLUS                                                loghighlite
  3700.  
  3701.  
  3702.          SUMMARY
  3703.  
  3704.          #include <graph.h>
  3705.          #include <gplus.h>
  3706.  
  3707.          int loghighlite(x1,y1,x2,y2);
  3708.          short x1,y1;                 upper left corner of image to highlight
  3709.          short x2,y2;                 lower right corner of image to highlite
  3710.  
  3711.  
  3712.          DESCRIPTION
  3713.  
  3714.          The loghighlite() function produces a negative of the image in
  3715.          the rectangle described by the logical coordinates (x1,y1),
  3716.          (x2,y2).  To return the image to its original state, call this
  3717.          function a second time with the same parameters.  This
  3718.          effectively negates a negative image.
  3719.  
  3720.          Technically, all this function does is a gpickup() followed by a
  3721.          gputdown() with an "action" of _GPRESET.
  3722.  
  3723.  
  3724.          RETURN VALUE
  3725.  
  3726.          This function returns a 0 if successful.  A -1 is returned if
  3727.          there was insufficient memory for the gpickup() function.
  3728.  
  3729.  
  3730.  
  3731.  
  3732.  
  3733.  
  3734.  
  3735.  
  3736.  
  3737.  
  3738.  
  3739.  
  3740.  
  3741.  
  3742.  
  3743.  
  3744.  
  3745.  
  3746.  
  3747.  
  3748.  
  3749.  
  3750.  
  3751.  
  3752.  
  3753.  
  3754.  
  3755.  
  3756.  
  3757.  
  3758.  
  3759.          Copyright 1989-1991 by Michael Yam            Graphic Image  5-6
  3760.  
  3761.  
  3762.  
  3763.  
  3764.  
  3765.          MPLUS                                                loghighlite
  3766.  
  3767.  
  3768.          EXAMPLE
  3769.  
  3770.          #include <graph.h>
  3771.          #include <gscreen.h>
  3772.          #include <gplus.h>
  3773.  
  3774.          main()
  3775.          {
  3776.              char *string = "Demo the highlite functions\n";
  3777.              char buffer[80];
  3778.              short x1, y1, x2, y2;
  3779.              GWDW *gwptr;
  3780.  
  3781.              mpsetvideomode( _ERESCOLOR );
  3782.              gwptr = gwdwopen(50, 50, 350, 150, _GFILLINTERIOR, BLACK, GREEN);
  3783.  
  3784.              mpouttext(string, BLACK, -1);
  3785.              mpouttext("Press a key to highlite...\n", BLACK, -1);
  3786.              getch();
  3787.  
  3788.              loghighlite( 0, 0, 300, 100 );
  3789.              mpouttext("Press a key...\n", BLACK, GREEN);
  3790.              getch();
  3791.  
  3792.              physhighlite( 50, 50, 350, 150 );
  3793.              mpouttext("Press a key...\n", BLACK, GREEN);
  3794.              getch();
  3795.              gwdwclose( gwptr );
  3796.              mpsetvideomode( _DEFAULTMODE );
  3797.              return 0;
  3798.          }
  3799.  
  3800.  
  3801.  
  3802.  
  3803.  
  3804.  
  3805.  
  3806.  
  3807.  
  3808.  
  3809.  
  3810.  
  3811.  
  3812.  
  3813.  
  3814.  
  3815.  
  3816.  
  3817.  
  3818.  
  3819.  
  3820.  
  3821.  
  3822.  
  3823.  
  3824.  
  3825.          Copyright 1989-1991 by Michael Yam            Graphic Image  5-7
  3826.  
  3827.  
  3828.  
  3829.  
  3830.  
  3831.          MPLUS                                                 mpgetimage
  3832.  
  3833.  
  3834.          SUMMARY
  3835.  
  3836.          #include <graph.h>
  3837.          #include <gplus.h>
  3838.  
  3839.          void mpgetimage(x1,y1,x2,y2,buffer)
  3840.          short x1,y1;                 upper left corner
  3841.          short x2,y2;                 lower right corner
  3842.          char *buffer;                pointer to storage for screen image
  3843.  
  3844.  
  3845.          DESCRIPTION
  3846.  
  3847.          Like Microsoft's _getimage(), this function saves a rectangular
  3848.          screen image in a memory buffer.  Also like the original, the
  3849.          programmer is responsible for calculating and allocating memory
  3850.          for the image.  The difference is that this function will check
  3851.          for the presence of a mouse cursor and hide it before reading
  3852.          the screen.
  3853.  
  3854.  
  3855.          RETURN VALUE
  3856.  
  3857.          None.
  3858.  
  3859.  
  3860.  
  3861.  
  3862.  
  3863.  
  3864.  
  3865.  
  3866.  
  3867.  
  3868.  
  3869.  
  3870.  
  3871.  
  3872.  
  3873.  
  3874.  
  3875.  
  3876.  
  3877.  
  3878.  
  3879.  
  3880.  
  3881.  
  3882.  
  3883.  
  3884.  
  3885.  
  3886.  
  3887.  
  3888.  
  3889.  
  3890.  
  3891.          Copyright 1989-1991 by Michael Yam            Graphic Image  5-8
  3892.  
  3893.  
  3894.  
  3895.  
  3896.  
  3897.          MPLUS                                                 mpgetimage
  3898.  
  3899.  
  3900.          EXAMPLE
  3901.  
  3902.          The example below slides a box across the screen.
  3903.  
  3904.          #include <malloc.h>
  3905.          #include <graph.h>
  3906.          #include <gscreen.h>
  3907.          #include <gplus.h>
  3908.  
  3909.          extern struct videoconfig _videoconfig;
  3910.  
  3911.          main()
  3912.          {
  3913.              char *image;
  3914.              short x1, y1, x2, y2;
  3915.              short x, xwidth, xmax;
  3916.  
  3917.              mpsetvideomode( _ERESCOLOR );
  3918.  
  3919.              _clearscreen( _GCLEARSCREEN );
  3920.              x1 = _videoconfig.numxpixels/2 - 10;
  3921.              y1 = _videoconfig.numypixels/2 - 10;
  3922.              x2 = _videoconfig.numxpixels/2 + 10;
  3923.              y2 = _videoconfig.numypixels/2 + 10;
  3924.              xwidth = x2-x1;
  3925.  
  3926.              _rectangle( _GFILLINTERIOR, x1, y1, x2, y2 );
  3927.              image = (char *)malloc( (unsigned int)_imagesize(x1,y1,x2,y2) );
  3928.              mpgetimage( x1, y1, x2, y2, image );
  3929.              _clearscreen( _GCLEARSCREEN );
  3930.              xmax = _videoconfig.numxpixels-xwidth-1;
  3931.              for( x=0; x<xmax; ++x )
  3932.              {
  3933.                   mpputimage( x, y1, image, _GXOR );
  3934.                   mpputimage( x, y1, image, _GXOR );
  3935.              }
  3936.  
  3937.              printf("Press a key");
  3938.              getch();
  3939.  
  3940.              free(image);
  3941.              mpsetvideomode( _DEFAULTMODE );
  3942.              return 0;
  3943.          }
  3944.  
  3945.  
  3946.  
  3947.  
  3948.  
  3949.  
  3950.  
  3951.  
  3952.  
  3953.  
  3954.  
  3955.  
  3956.  
  3957.          Copyright 1989-1991 by Michael Yam            Graphic Image  5-9
  3958.  
  3959.  
  3960.  
  3961.  
  3962.  
  3963.          MPLUS                                                 mpputimage
  3964.  
  3965.  
  3966.          SUMMARY
  3967.  
  3968.          #include <graph.h>
  3969.          #include <gplus.h>
  3970.  
  3971.          void mpputimage(x1,y1,image,action)
  3972.          short x1,y1;                 upper left corner of image
  3973.          char *image;                 image storage obtained from
  3974.                                       mpgetimage()
  3975.          short action;                interaction with existing screen image
  3976.  
  3977.  
  3978.          DESCRIPTION
  3979.  
  3980.          Like Microsoft's _putimage(), this function transfers to the
  3981.          screen the contents of the "image" buffer.  Unlike Microsoft's
  3982.          version, mpputimage() ensures that the mouse cursor does not
  3983.          interfere with image being transferred.
  3984.  
  3985.          The "action" argument defines the type of interaction.  Manifest
  3986.          constants are defined in graph.h and are described in
  3987.          Microsoft's documentation of _putimage().  The table below
  3988.          summarizes the available logical operations:
  3989.  
  3990.              Constant                 Meaning
  3991.              ----------------------------------------------------------
  3992.              _GAND                    ANDs the image to screen.
  3993.              _GOR                     ORs the image to screen.
  3994.              _GPRESET                 NOTs the image to screen.
  3995.              _GPSET                   Copies the image to screen.
  3996.              _GXOR                    XORs the image to screen.
  3997.  
  3998.  
  3999.          RETURN VALUE
  4000.  
  4001.          None.
  4002.  
  4003.  
  4004.          EXAMPLE
  4005.  
  4006.          See mpgetimage().
  4007.  
  4008.  
  4009.  
  4010.  
  4011.  
  4012.  
  4013.  
  4014.  
  4015.  
  4016.  
  4017.  
  4018.  
  4019.  
  4020.  
  4021.  
  4022.  
  4023.          Copyright 1989-1991 by Michael Yam           Graphic Image  5-10
  4024.  
  4025.  
  4026.  
  4027.  
  4028.  
  4029.          MPLUS                                               physhighlite
  4030.  
  4031.  
  4032.          SUMMARY
  4033.  
  4034.          #include <graph.h>
  4035.          #include <gplus.h>
  4036.  
  4037.          int physhighlite(x1,y1,x2,y2);
  4038.          short x1,y1;                 upper left corner of image to highlight
  4039.          short x2,y2;                 lower right corner of image to highlight
  4040.  
  4041.  
  4042.          DESCRIPTION
  4043.  
  4044.          The physhighlite() function produces a negative of the image in
  4045.          the rectangle described by the physical coordinates (x1,y1),
  4046.          (x2,y2).  To return the image to its original state, call this
  4047.          function a second time with the same parameters.  This
  4048.          effectively negates a negative image.
  4049.  
  4050.          Technically, all this function does is a gpickup() followed by a
  4051.          gputdown() with an "action" of _GPRESET.
  4052.  
  4053.  
  4054.          RETURN VALUE
  4055.  
  4056.          This function returns a 0 if successful.  A -1 is returned if
  4057.          there was insufficient memory for the gpickup() function.
  4058.  
  4059.  
  4060.          EXAMPLE
  4061.  
  4062.          See loghighlite().
  4063.  
  4064.  
  4065.  
  4066.  
  4067.  
  4068.  
  4069.  
  4070.  
  4071.  
  4072.  
  4073.  
  4074.  
  4075.  
  4076.  
  4077.  
  4078.  
  4079.  
  4080.  
  4081.  
  4082.  
  4083.  
  4084.  
  4085.  
  4086.  
  4087.  
  4088.  
  4089.          Copyright 1989-1991 by Michael Yam           Graphic Image  5-11
  4090.  
  4091.  
  4092.  
  4093.  
  4094.  
  4095.          MPLUS                                                    xorline
  4096.  
  4097.  
  4098.          SUMMARY
  4099.  
  4100.          #include <gplus.h>
  4101.          #include <gscreen.h>
  4102.  
  4103.          void xorline(x1,y1,x2,y2,fg,bg);
  4104.          short x1,y1;                 starting point for line
  4105.          short x2,y2;                 ending point for line
  4106.          short fg;                    foreground color of line
  4107.          short bg;                    current background color
  4108.  
  4109.          DESCRIPTION
  4110.  
  4111.          This routine is a non-destructive line drawing function since it
  4112.          uses the "exclusive or" (see chapter preface).  The line may be
  4113.          removed from the screen and the background restored by calling
  4114.          this function again with the same parameters.
  4115.  
  4116.          Manifest constants are available for EGA/VGA modes in gscreen.h
  4117.          for the foreground and background colors.
  4118.  
  4119.          Microsoft C 6.0 users: a faster alternative to xorline() would
  4120.          be to use _setwritemode(_GXOR) with _moveto() and _lineto().
  4121.  
  4122.  
  4123.          RETURN VALUE
  4124.  
  4125.          None.
  4126.  
  4127.  
  4128.          EXAMPLE
  4129.  
  4130.          The example below firsts opens a graphic window and outputs some
  4131.          text.  Then two xor lines criss cross the window, illustrating
  4132.          their non-destructive characteristics.
  4133.  
  4134.          #include <graph.h>
  4135.          #include <gplus.h>
  4136.          #include <gscreen.h>
  4137.  
  4138.          /*      MRES 4 color defines for palette 3
  4139.           */
  4140.          #define MBLACK          0
  4141.          #define MLIGHTCYAN      1
  4142.          #define MLIGHTMAGENTA   2
  4143.          #define MWHITE          3
  4144.  
  4145.  
  4146.  
  4147.  
  4148.  
  4149.  
  4150.  
  4151.  
  4152.  
  4153.  
  4154.  
  4155.          Copyright 1989-1991 by Michael Yam           Graphic Image  5-12
  4156.  
  4157.  
  4158.  
  4159.  
  4160.  
  4161.          MPLUS                                                    xorline
  4162.  
  4163.  
  4164.          main()
  4165.          {
  4166.              short x, y;
  4167.              short xinc, yinc;
  4168.              GWDW *gwptr;
  4169.  
  4170.              mpsetvideomode( _MRES4COLOR );
  4171.              _selectpalette(3);
  4172.              gwptr = gwdwopen( 50, 50, 250, 150, _GFILLINTERIOR, MBLACK, MWHITE );
  4173.              mpouttext( "Demo of non-\ndestructive xor lines.\n", MBLACK, -1 );
  4174.              mpouttext( "Press a key to quit.\n", MBLACK, -1 );
  4175.  
  4176.              x=0;
  4177.              y=0;
  4178.              while(1)
  4179.              {
  4180.                  xorline( 0, y, 200, y, MLIGHTCYAN, -1);
  4181.                  xorline( x, 0, x, 100, MLIGHTMAGENTA, -1);
  4182.                  xorline( 0, y, 200, y, MLIGHTCYAN, -1);
  4183.                  xorline( x, 0, x, 100, MLIGHTMAGENTA, -1);
  4184.                  if( x >= 200 )
  4185.                      xinc = -1;
  4186.                  else if( x <= 0 )
  4187.                      xinc = 1;
  4188.                  x += xinc;
  4189.  
  4190.                  if( y >= 100 )
  4191.                      yinc = -1;
  4192.                  else if( y <= 0 )
  4193.                      yinc = 1;
  4194.                  y += yinc;
  4195.  
  4196.                  if( kbhit() )
  4197.                      break;
  4198.              }
  4199.              gwdwclose( gwptr );
  4200.              mpsetvideomode( _DEFAULTMODE );
  4201.          }
  4202.  
  4203.  
  4204.  
  4205.  
  4206.  
  4207.  
  4208.  
  4209.  
  4210.  
  4211.  
  4212.  
  4213.  
  4214.  
  4215.  
  4216.  
  4217.  
  4218.  
  4219.  
  4220.  
  4221.          Copyright 1989-1991 by Michael Yam           Graphic Image  5-13
  4222.  
  4223.  
  4224.  
  4225.  
  4226.  
  4227.          MPLUS                                                      xorpt
  4228.  
  4229.  
  4230.          SUMMARY
  4231.  
  4232.          #include <gplus.h>
  4233.          #include <gscreen.h>
  4234.  
  4235.          void xorpt(x,y,fg,bg);
  4236.          short x,y;                   point position
  4237.          short fg;                    color it should appear in
  4238.          short bg;                    current background color
  4239.  
  4240.  
  4241.          DESCRIPTION
  4242.  
  4243.          This routine is a non-destructive point plotting function since
  4244.          it uses the "exclusive or" (see chapter preface).  The point may
  4245.          be removed from the screen and the background restored by
  4246.          calling the function again with the same parameters.
  4247.  
  4248.          Manifest constants are available for EGA/VGA modes in gscreen.h
  4249.          for the foreground and background colors.
  4250.  
  4251.          This function is provided for those who need to design routines
  4252.          such as xorellipse().  Unlike MPLUS' other image functions,
  4253.          xorpt() does no cursor checking since it is very inefficient to
  4254.          examine the mouse cursor every time a point is plotted.
  4255.          Instead, when writing a routine such as xorellipse(), if the
  4256.          cursor is visible, hide it at the start of the function and
  4257.          restore it at the end of the function.
  4258.  
  4259.  
  4260.          RETURN VALUE
  4261.  
  4262.          None.
  4263.  
  4264.  
  4265.  
  4266.  
  4267.  
  4268.  
  4269.  
  4270.  
  4271.  
  4272.  
  4273.  
  4274.  
  4275.  
  4276.  
  4277.  
  4278.  
  4279.  
  4280.  
  4281.  
  4282.  
  4283.  
  4284.  
  4285.  
  4286.  
  4287.          Copyright 1989-1991 by Michael Yam           Graphic Image  5-14
  4288.  
  4289.  
  4290.  
  4291.  
  4292.  
  4293.          MPLUS                                                   MENU BAR
  4294.  
  4295.  
  4296.  
  4297.  
  4298.  
  4299.  
  4300.  
  4301.          CHAPTER  6
  4302.          ----------
  4303.  
  4304.  
  4305.  
  4306.          THE  MENU  BAR
  4307.  
  4308.          The functions described in this chapter create a horizontal bar
  4309.          menu with pull down windows.  Depending upon available memory
  4310.          and screen space, up to five levels of submenus are supported,
  4311.          although two levels should be sufficient for most applications.
  4312.          The menu also supports hot keys, check marks (really an
  4313.          asterisk), and "greyout", a technique used to disable a menu
  4314.          choice.  Menu functions are prefixed with an "mb_".
  4315.  
  4316.          The mouse and keyboard are supported input devices.  To make a
  4317.          menu selection with a mouse, position the cursor in the bar,
  4318.          over a menu title.  Pressing the left button will highlight the
  4319.          menu title and open a pull-down menu. The button must be held
  4320.          down to keep pull-down menu open.  To close the pull-down menu
  4321.          and open others, keep the left button down and slide the cursor
  4322.          over to other titles along the bar.
  4323.  
  4324.          To select one of the options in the pull-down menu, drag the
  4325.          cursor over one of the choices and release the left button.  If
  4326.          no selection is desired, slide the cursor out of the pull-down
  4327.          menu and release the left button.
  4328.  
  4329.          Using a keyboard to select from the menu bar requires an "Alt"
  4330.          key combined with the first character of the desired menu title.
  4331.          This opens a pull-down menu.  The left and right cursor keys may
  4332.          be used to enter submenus (if present) or to close the current
  4333.          pull-down menu and open adjacent menus.  "Tab" and "Shift Tab"
  4334.          behave similarly, except they bypass all submenus.
  4335.  
  4336.          Use the up and down cursor keys to point to titles within the
  4337.          pull-down menu.  These selections may also be made by pressing
  4338.          the first character of the titles (no "Alt" this time).  If more
  4339.          than one title begins with the same character, pressing that
  4340.          character again will point to the next matching selection.
  4341.          Pressing "Return" makes the decision final while pressing "Esc"
  4342.          just closes the pull-down menu with no further action.
  4343.  
  4344.  
  4345.  
  4346.  
  4347.  
  4348.  
  4349.  
  4350.  
  4351.  
  4352.  
  4353.          Copyright 1989-1991 by Michael Yam                 Menu Bar  6-1
  4354.  
  4355.  
  4356.  
  4357.  
  4358.  
  4359.          MPLUS                                                   MENU BAR
  4360.  
  4361.  
  4362.          Setting up your menus require plugging in titles and pointers to
  4363.          functions into two structures:
  4364.  
  4365.          struct MENU_INFO
  4366.          {
  4367.              int  exitkey;       /* quit key */
  4368.              int  (*exitfun)();  /* ptr to quit function */
  4369.              word fg0, bg0;      /* color of menu bar */
  4370.              word keycolor0;     /* color of ALT KEY */
  4371.              word greyout0;      /* color of disabled bar title */
  4372.              word border;        /* border flag */
  4373.              word fg, bg;        /* color of pull-down menu */
  4374.              word keycolor;      /* color of title's first char */
  4375.              word greyout;       /* color of disabled title */
  4376.          };
  4377.  
  4378.          struct MENU_ITEM
  4379.          {
  4380.              char *title;                  /* title string */
  4381.              int (*function)();            /* ptr to function */
  4382.              struct MENU_ITEM *menu_item;  /* titles for submenu */
  4383.              int hotkey;                   /* key to activate function */
  4384.              unsigned submenu: 1           /* bit indicates submenu */
  4385.              unsigned greyout: 1           /* bit disables title */
  4386.              unsigned checkmark: 1         /* bit displays a '*' */
  4387.  
  4388.              /* Remaining five bits reserved for future */
  4389.          };
  4390.  
  4391.  
  4392.          The structure MENU_INFO is used to define various attributes of
  4393.          the menu, including its colors, an exit key, and an exit
  4394.          function.  Regarding colors, you may initialize them to a
  4395.          default set with the function mb_stdcolors().  See the function
  4396.          description for details.
  4397.  
  4398.          Defining an exit key and an exit function would save the user
  4399.          from hunting through an array of menus to find that "quit"
  4400.          function.  The exit key may be any key that has a scan and
  4401.          ascii code, but typically would be "Esc", "Ctrl Q", or "Alt X".
  4402.          The function mb_run() will watch for the assigned key and if
  4403.          detected, return a pointer to your exit function.
  4404.  
  4405.              Suggested Exit Keys      Scan and Ascii Code
  4406.              --------------------------------------------
  4407.              Esc                      0x011B
  4408.              Ctrl Q                   0x1011
  4409.              Alt X                    0x2D00
  4410.  
  4411.  
  4412.  
  4413.  
  4414.  
  4415.  
  4416.  
  4417.  
  4418.  
  4419.          Copyright 1989-1991 by Michael Yam                 Menu Bar  6-2
  4420.  
  4421.  
  4422.  
  4423.  
  4424.  
  4425.          MPLUS                                                   MENU BAR
  4426.  
  4427.  
  4428.          The structure MENU_ITEM is used to store your menu titles,
  4429.          pointers to functions, submenu titles, and other menu
  4430.          attributes.  Examples of initializing this structure can be
  4431.          found in the function description for mb_open() and in the file
  4432.          MENUDEMO.C
  4433.  
  4434.  
  4435.          FUNCTION SUMMARY
  4436.  
  4437.              Routine                  Purpose
  4438.              ----------------------------------------------------------
  4439.              mb_close()               Closes and removes menu bar.
  4440.              mb_hide()                Hides the menu bar and restores the
  4441.                                       background.
  4442.              mb_open()                Initializes a menu bar and displays
  4443.                                       it on screen.
  4444.              mb_run()                 Runs the menu bar.
  4445.              mb_setbits()             Clears or sets menu attribute bits.
  4446.              mb_show()                Shows the menu bar hidden by
  4447.                                       mb_hide().
  4448.              mb_stdcolors()           Initialize menu system to a default
  4449.                                       set of colors (EGA & VGA only).
  4450.  
  4451.  
  4452.  
  4453.  
  4454.  
  4455.  
  4456.  
  4457.  
  4458.  
  4459.  
  4460.  
  4461.  
  4462.  
  4463.  
  4464.  
  4465.  
  4466.  
  4467.  
  4468.  
  4469.  
  4470.  
  4471.  
  4472.  
  4473.  
  4474.  
  4475.  
  4476.  
  4477.  
  4478.  
  4479.  
  4480.  
  4481.  
  4482.  
  4483.  
  4484.  
  4485.          Copyright 1989-1991 by Michael Yam                 Menu Bar  6-3
  4486.  
  4487.  
  4488.  
  4489.  
  4490.  
  4491.          MPLUS                                                   mb_close
  4492.  
  4493.  
  4494.          SUMMARY
  4495.  
  4496.          #include <stdio.h>
  4497.          #include <graph.h>
  4498.          #include <gplus.h>
  4499.          #include <mpmenu.h>
  4500.  
  4501.          int mb_close(void);
  4502.  
  4503.  
  4504.          DESCRIPTION
  4505.  
  4506.          The mb_close() function closes the menu bar, and removes it from
  4507.          the screen, restoring the original background.
  4508.  
  4509.  
  4510.          RETURN VALUE
  4511.  
  4512.          This function returns a 0 if the menu bar was closed
  4513.          successfully.  A -1 is returned on failure.
  4514.  
  4515.  
  4516.  
  4517.  
  4518.  
  4519.  
  4520.  
  4521.  
  4522.  
  4523.  
  4524.  
  4525.  
  4526.  
  4527.  
  4528.  
  4529.  
  4530.  
  4531.  
  4532.  
  4533.  
  4534.  
  4535.  
  4536.  
  4537.  
  4538.  
  4539.  
  4540.  
  4541.  
  4542.  
  4543.  
  4544.  
  4545.  
  4546.  
  4547.  
  4548.  
  4549.  
  4550.  
  4551.          Copyright 1989-1991 by Michael Yam                 Menu Bar  6-4
  4552.  
  4553.  
  4554.  
  4555.  
  4556.  
  4557.          MPLUS                                                    mb_hide
  4558.  
  4559.  
  4560.          SUMMARY
  4561.  
  4562.          #include <stdio.h>
  4563.          #include <graph.h>
  4564.          #include <gplus.h>
  4565.          #include <mpmenu.h>
  4566.  
  4567.          void mb_hide(void);
  4568.  
  4569.  
  4570.          DESCRIPTION
  4571.  
  4572.          This function will hide the menu bar and restore the background.
  4573.          It is useful when your application requires the entire screen.
  4574.          Combined with mb_show(), it is an efficient alternative to
  4575.          opening and closing the menu bar with mb_open() and mb_close().
  4576.  
  4577.          Note that the video mode should not be changed between calls to
  4578.          mb_hide() and mb_show().  Otherwise, either the background or
  4579.          the menu will not be restored properly.
  4580.  
  4581.  
  4582.          RETURN VALUE
  4583.  
  4584.          None.
  4585.  
  4586.  
  4587.  
  4588.  
  4589.  
  4590.  
  4591.  
  4592.  
  4593.  
  4594.  
  4595.  
  4596.  
  4597.  
  4598.  
  4599.  
  4600.  
  4601.  
  4602.  
  4603.  
  4604.  
  4605.  
  4606.  
  4607.  
  4608.  
  4609.  
  4610.  
  4611.  
  4612.  
  4613.  
  4614.  
  4615.  
  4616.  
  4617.          Copyright 1989-1991 by Michael Yam                 Menu Bar  6-5
  4618.  
  4619.  
  4620.  
  4621.  
  4622.  
  4623.          MPLUS                                                    mb_open
  4624.  
  4625.  
  4626.          SUMMARY
  4627.  
  4628.          #include <stdio.h>
  4629.          #include <graph.h>
  4630.          #include <gplus.h>
  4631.          #include <mpmenu.h>
  4632.  
  4633.          int mb_open(r1,c1,c2,struct MENU_INFO menu_info,
  4634.                      struct MENU_ITEM menu_item);
  4635.          short r1, c1;                starting row and col of menu bar
  4636.          short c2;                    ending col of menu bar
  4637.          struct MENU_INFO *menu_info; menu colors, etc.
  4638.          struct MENU_ITEM *menu_item; titles, function ptrs, etc.
  4639.  
  4640.  
  4641.          DESCRIPTION
  4642.  
  4643.          The mb_open() function initializes the menu system with the
  4644.          information provided in the structures MENU_INFO and MENU_ITEM.
  4645.          mb_open() then opens the menu bar at the row and column
  4646.          specified by the "r1" and "c1" parameters.  The bar ends at
  4647.          "c2."
  4648.  
  4649.  
  4650.          RETURN VALUE
  4651.  
  4652.          This function returns a 0 if successful.  A -1 is returned on
  4653.          failure.
  4654.  
  4655.  
  4656.  
  4657.  
  4658.  
  4659.  
  4660.  
  4661.  
  4662.  
  4663.  
  4664.  
  4665.  
  4666.  
  4667.  
  4668.  
  4669.  
  4670.  
  4671.  
  4672.  
  4673.  
  4674.  
  4675.  
  4676.  
  4677.  
  4678.  
  4679.  
  4680.  
  4681.  
  4682.  
  4683.          Copyright 1989-1991 by Michael Yam                 Menu Bar  6-6
  4684.  
  4685.  
  4686.  
  4687.  
  4688.  
  4689.          MPLUS                                                    mb_open
  4690.  
  4691.  
  4692.          FRAGMENT
  4693.  
  4694.          The following code fragment initializes the menu structures and
  4695.          opens a menu bar:
  4696.  
  4697.  
  4698.          #define  _ESC      0x011B
  4699.          #define  CTRL_F1   0x5E00
  4700.  
  4701.          extern int exitfun();             /* Your exit function */
  4702.          extern int dummy();               /* Just for illustration */
  4703.                   :
  4704.                   :
  4705.          struct MENU_INFO menu_info =
  4706.          {
  4707.              _ESC, exitfun,                /* Exit key & function */
  4708.              BLACK, WHITE, RED, GREY,      /* Menu bar attributes */
  4709.              _GBORDER,                     /* Border for pull-down */
  4710.              BLUE, WHITE, BLUE, GREY,      /* Pull-down attributes */
  4711.          };
  4712.  
  4713.          /*  CTRL_F1 is assigned as a hot key to execute dummy().  The
  4714.           *  '\t' in the Martini title string will right justify
  4715.           *  "CTRL_F1" in the menu window.
  4716.           */
  4717.          struct MENU_ITEM mi_alcohol[] =
  4718.          {
  4719.              "Methanol", NULL, NULL, 0, 0,1,0,  /* Mark greyout */
  4720.              "Ethanol",  NULL, NULL, 0, 0,1,0,  /* Mark greyout */
  4721.              "Martini\tCTRL_F1", dummy, NULL, CTRL_F1, 0,0,0,
  4722.              NULL, NULL, NULL, 0, 0,0,0, /* Terminate list */
  4723.          };
  4724.  
  4725.          struct MENU_ITEM menubar[] =      /* Main menu bar */
  4726.          {
  4727.              "Alcohols", NULL, mi_alcohol, 0, 1,0,0,  /* mark submenu */
  4728.              NULL, NULL, NULL, 0, 0,0,0,   /* Terminate list */
  4729.          };
  4730.                   :
  4731.                   :
  4732.          main()
  4733.          {
  4734.                   :
  4735.                   :
  4736.              mb_open (1, 1, 80, &menu_info, menubar);
  4737.                   :
  4738.                   :
  4739.              mb_close();
  4740.                   :
  4741.                   :
  4742.          };
  4743.  
  4744.  
  4745.  
  4746.  
  4747.  
  4748.  
  4749.          Copyright 1989-1991 by Michael Yam                 Menu Bar  6-7
  4750.  
  4751.  
  4752.  
  4753.  
  4754.  
  4755.          MPLUS                                                     mb_run
  4756.  
  4757.  
  4758.          SUMMARY
  4759.  
  4760.          #include <graph.h>
  4761.          #include <gscreen.h>
  4762.          #include <gplus.h>
  4763.          #include <mpmenu.h>
  4764.  
  4765.          int (*mb_run(void))();
  4766.  
  4767.  
  4768.          DESCRIPTION
  4769.  
  4770.          The mb_run() function will run the bar menu after proper
  4771.          structure initialization.  It will respond to the user's inputs
  4772.          -- mouse or keyboard -- and open and close windows accordingly.
  4773.          If there is no input, this function simply returns a NULL
  4774.          pointer.
  4775.  
  4776.  
  4777.          RETURN VALUE
  4778.  
  4779.          The return value depends on the user input.  If the input was
  4780.          valid, a pointer to a function is returned.  If the input was
  4781.          invalid, or there was no input, the pointer returned is NULL.
  4782.  
  4783.          It is up to the programmer to decide what to do with the pointer
  4784.          returned.  Normally, the function should be called.  Returning a
  4785.          pointer to the function instead of executing it from within
  4786.          mb_run() lets the programmer call the function with arguments.
  4787.  
  4788.  
  4789.          FRAGMENT
  4790.  
  4791.          This fragment runs the menu system as long as the exit function
  4792.          isn't called:
  4793.  
  4794.          extern int exitfun();
  4795.                   :
  4796.                   :
  4797.          int (*function)();           /* function pointer */
  4798.                   :
  4799.                   :
  4800.          function = NULL;
  4801.          while (function != exitfun || ret != 0)
  4802.          {
  4803.              function = mb_run();
  4804.              if (function != NULL)
  4805.                   ret = function();   /* execute.  Can pass args. */
  4806.          };
  4807.                   :
  4808.                   :
  4809.  
  4810.  
  4811.  
  4812.  
  4813.  
  4814.  
  4815.          Copyright 1989-1991 by Michael Yam                 Menu Bar  6-8
  4816.  
  4817.  
  4818.  
  4819.  
  4820.  
  4821.          MPLUS                                                 mb_setbits
  4822.  
  4823.  
  4824.          SUMMARY
  4825.  
  4826.          #include <graph.h>
  4827.          #include <gplus.h>
  4828.          #include <mpmenu.h>
  4829.  
  4830.          int mb_setbits(menu_item, mask, status);
  4831.          struct MENU_ITEM *menu_item;
  4832.          unsigned int mask;                bit(s) to set
  4833.          unsigned int status;              0 or 1
  4834.  
  4835.  
  4836.          DESCRIPTION
  4837.  
  4838.          The function mb_setbits() will set to 0 or 1 all the bits
  4839.          specified by "mask" in "menu_item."  "mask" constants are
  4840.          defined in "mpmenu.h" and are as follows:
  4841.  
  4842.  
  4843.              Constant                 Value
  4844.              --------------------------------
  4845.              MB_SUBMENU               0x80
  4846.              MB_GREYOUT               0x40
  4847.              MB_CHECKMARK             0x20
  4848.  
  4849.          This function is useful for clearing check marks in a menu item.
  4850.          The constants may be or'd (|) together to modify other bits as
  4851.          well.
  4852.  
  4853.  
  4854.          RETURN VALUE
  4855.  
  4856.          This function returns a 0 if successful, a -1 on failure.
  4857.  
  4858.  
  4859.          FRAGMENT
  4860.  
  4861.          struct MENU_ITEM mi_vmodes[] =
  4862.          {
  4863.              "CGA", setcga(), NULL, 0, 0,0,1,   /* check mark enabled */
  4864.              "EGA", setega(), NULL, 0, 0,0,0,
  4865.              "VGA", setvga(), NULL, 0, 0,0,0,
  4866.              NULL, NULL, NULL, 0, 0,0,0,
  4867.          };
  4868.              :
  4869.              :
  4870.          /*   Turn off all check marks then
  4871.           *   turn on checkmark for VGA.
  4872.           */
  4873.           mb_setbits( mi_vmodes, MB_CHECKMARK, 0 );
  4874.           mi_vmodes[2].checkmark = 1;
  4875.              :
  4876.              :
  4877.  
  4878.  
  4879.  
  4880.  
  4881.          Copyright 1989-1991 by Michael Yam                 Menu Bar  6-9
  4882.  
  4883.  
  4884.  
  4885.  
  4886.  
  4887.          MPLUS                                                    mb_show
  4888.  
  4889.  
  4890.          SUMMARY
  4891.  
  4892.          #include <stdio.h>
  4893.          #include <graph.h>
  4894.          #include <gplus.h>
  4895.          #include <mpmenu.h>
  4896.  
  4897.          void mb_show(void);
  4898.  
  4899.  
  4900.          DESCRIPTION
  4901.  
  4902.          This function shows the menu bar hidden by the function
  4903.          mb_hide().  As a pair, these functions are an efficient
  4904.          alternative to opening and closing the menu bar with mb_open()
  4905.          and mb_close().
  4906.  
  4907.          Note that the video mode should not be changed between calls to
  4908.          mb_hide() and mb_show().  Otherwise, the menu will not be
  4909.          restored properly.
  4910.  
  4911.  
  4912.          RETURN VALUE
  4913.  
  4914.          None.
  4915.  
  4916.  
  4917.  
  4918.  
  4919.  
  4920.  
  4921.  
  4922.  
  4923.  
  4924.  
  4925.  
  4926.  
  4927.  
  4928.  
  4929.  
  4930.  
  4931.  
  4932.  
  4933.  
  4934.  
  4935.  
  4936.  
  4937.  
  4938.  
  4939.  
  4940.  
  4941.  
  4942.  
  4943.  
  4944.  
  4945.  
  4946.  
  4947.          Copyright 1989-1991 by Michael Yam                Menu Bar  6-10
  4948.  
  4949.  
  4950.  
  4951.  
  4952.  
  4953.          MPLUS                                               mb_stdcolors
  4954.  
  4955.  
  4956.          SUMMARY
  4957.  
  4958.          #include <graph.h>
  4959.          #Include <gscreen.h>
  4960.          #include <gplus.h>
  4961.          #include <mpmenu.h>
  4962.  
  4963.          void mb_stdcolors(menu_info);
  4964.          struct MENU_INFO *menu_info;      structure to init
  4965.  
  4966.  
  4967.          DESCRIPTION
  4968.  
  4969.          The mb_stdcolors() function initializes the menu system with a
  4970.          set of default colors.  This function is provided for
  4971.          convenience and is easy to customize.  It assumes EGA and VGA 16
  4972.          color modes.
  4973.  
  4974.  
  4975.          RETURN VALUE
  4976.  
  4977.          None.
  4978.  
  4979.  
  4980.          FRAGMENT
  4981.  
  4982.          Reproduced here is the source to mb_stdcolors().  The color
  4983.          combinations look best on a grey background.  Structure elements
  4984.          suffixed with a "0" refer to the menu bar, while the remaining
  4985.          elements refer to the pull-down menu.
  4986.  
  4987.  
  4988.          void mb_stdcolors(menu_info)
  4989.          struct MENU_INFO *menu_info;
  4990.          {
  4991.              menu_info->fg0 = BLACK;
  4992.              menu_info->bg0 = WHITE;
  4993.              menu_info->keycolor0 = RED;
  4994.              menu_info->greyout0 = GREY;
  4995.              menu_info->border = _GBORDER;
  4996.              menu_info->fg = BLACK;
  4997.              menu_info->bg = WHITE;
  4998.              menu_info->keycolor = BLACK;
  4999.              menu_info->greyout = GREY;
  5000.              return;
  5001.          }
  5002.  
  5003.  
  5004.  
  5005.  
  5006.  
  5007.  
  5008.  
  5009.  
  5010.  
  5011.  
  5012.  
  5013.          Copyright 1989-1991 by Michael Yam                Menu Bar  6-11
  5014.  
  5015.  
  5016.  
  5017.  
  5018.  
  5019.          MPLUS                                                     MOUSER
  5020.  
  5021.  
  5022.  
  5023.  
  5024.  
  5025.  
  5026.  
  5027.          CHAPTER  7
  5028.          ----------
  5029.  
  5030.  
  5031.          MOUSER -- with respect to the most famous mouser of them all,
  5032.                    "Sylvester the Cat."
  5033.  
  5034.          The routines here support a Microsoft or compatible mouse and
  5035.          provide a range of services from resetting the mouse to
  5036.          retrieving input from either the mouse or keyboard.  If no mouse
  5037.          is present, calling these functions will have no effect.
  5038.  
  5039.          Note that these functions are valid only in graphic video modes;
  5040.          text modes are not supported.  When using Microsoft's graphics
  5041.          output routines, remember to hide the mouse before updating or
  5042.          reading the screen.  Otherwise, the mouse will interfere with
  5043.          the screen image.  Except where indicated, all MPLUS functions
  5044.          handle the mouse automatically.
  5045.  
  5046.          A few routines reference a structure named "ms_status."  It is
  5047.          defined in mouser.h and has the following elements:
  5048.  
  5049.              struct ms_status
  5050.              {
  5051.                   unsigned int condmask;   event mask or type of activity
  5052.                   int lbtn;                left button: 0 = up, 1 = down
  5053.                   int lbpress;             the number of left button presses
  5054.                   int lbrelease;           the number of left button releases
  5055.                   int rbtn;                right button: 0 = up, 1 = down
  5056.                   int rbpress;             the number of right button presses
  5057.                   int rbrelease;           the number of right button releases
  5058.                   short x, y;              mouse cursor position
  5059.              }
  5060.  
  5061.          Mouse activity is returned in this structure for easy reference.
  5062.          Note that the element "condmask", currently used only by
  5063.          dev_ready(), is a mask which defines the type of mouse activity
  5064.          the user applied.  It can have one or a combination of
  5065.          the following values:
  5066.  
  5067.              Constant       Hex Value      Meaning
  5068.              ---------------------------------------------------
  5069.              _CSRMOVED      0x01           cursor moved
  5070.              _LBPRESSED     0x02           left button pressed
  5071.              _LBRELEASED    0x04           left button released
  5072.              _RBPRESSED     0x08           right button pressed
  5073.              _RBRELEASED    0x10           right button released
  5074.  
  5075.  
  5076.  
  5077.  
  5078.  
  5079.          Copyright 1989-1991 by Michael Yam                    Mouser 7-1
  5080.  
  5081.  
  5082.  
  5083.  
  5084.  
  5085.          MPLUS                                                     MOUSER
  5086.  
  5087.  
  5088.          FUNCTION SUMMARY
  5089.  
  5090.              Routine                  Purpose
  5091.              ----------------------------------------------------------
  5092.              dev_ready()              Checks the keyboard and mouse for
  5093.                                       input.
  5094.              ginrectangle()           Determines if point x,y lies in a
  5095.                                       rectangle or not.
  5096.              ginwindow()              Determines if point x,y lies in a
  5097.                                       graphic window or not.
  5098.              ms_cursor()              Returns the status of the cursor --
  5099.                                       on or off.
  5100.              ms_getposition()         Gets the cursor position and the
  5101.                                       status of the mouse buttons.
  5102.              ms_getpress()            Retrieves the status of the
  5103.                                       specified button and the number of
  5104.                                       times it was pressed since this
  5105.                                       function was last called.
  5106.              ms_getrelease()          Retrieves the status of the
  5107.                                       specified button and the number of
  5108.                                       times it was released since this
  5109.                                       function was last called.
  5110.              ms_hidecursor()          Hides the cursor.
  5111.              ms_poll()                Polls the mouse for input.
  5112.              ms_ready()               Determines if the mouse has input.
  5113.              ms_reset()               Resets the mouse driver.
  5114.              ms_setevent()            Enables/Disables mouse event
  5115.                                       checking.
  5116.              ms_setposition()         Positions the cursor at specified
  5117.                                       coordinates.
  5118.              ms_showcursor()          Displays the cursor on the screen.
  5119.              ms_window()              Defines the screen region where the
  5120.                                       cursor may roam.
  5121.  
  5122.  
  5123.  
  5124.  
  5125.  
  5126.  
  5127.  
  5128.  
  5129.  
  5130.  
  5131.  
  5132.  
  5133.  
  5134.  
  5135.  
  5136.  
  5137.  
  5138.  
  5139.  
  5140.  
  5141.  
  5142.  
  5143.  
  5144.  
  5145.          Copyright 1989-1991 by Michael Yam                    Mouser 7-2
  5146.  
  5147.  
  5148.  
  5149.  
  5150.  
  5151.          MPLUS                                                  dev_ready
  5152.  
  5153.  
  5154.          SUMMARY
  5155.  
  5156.          #include <mouser.h>
  5157.  
  5158.          int dev_ready(ch,ms_status);
  5159.          int *ch;                     the keystroke pressed
  5160.          struct ms_status *ms_status; the mouse status
  5161.  
  5162.  
  5163.          DESCRIPTION
  5164.  
  5165.          The dev_ready() function checks the keyboard and the mouse for
  5166.          input, then returns the active device.  If there was a keystroke
  5167.          in the keyboard buffer, it would be retrieved and stored in
  5168.          "ch."  If the mouse was active, its status would be retrieved
  5169.          and stored in "ms_status."  If neither device was accessed by
  5170.          the user, the function would return a zero.
  5171.  
  5172.          When a mouse is moved or its buttons pressed or released, an
  5173.          interrupt is generated and signals dev_ready() that there is
  5174.          mouse input.  "condmask" is a bit mask which identifies the
  5175.          mouse activity which triggered the interrupt.  Possible masks
  5176.          are defined in mouser.h and are discussed in the chapter
  5177.          preface.
  5178.  
  5179.          Mouse event checking must be enabled for this function to work.
  5180.          This is accomplished with:
  5181.  
  5182.              ms_setevent(1);
  5183.  
  5184.  
  5185.          RETURN VALUE
  5186.  
  5187.          Constants defining the returned devices are in mouser.h and are
  5188.          listed below.
  5189.  
  5190.              Constant            Meaning
  5191.              -----------------------------
  5192.              _KB                 Keyboard
  5193.              _MS                 Mouse
  5194.              0                   No device
  5195.  
  5196.  
  5197.  
  5198.  
  5199.  
  5200.  
  5201.  
  5202.  
  5203.  
  5204.  
  5205.  
  5206.  
  5207.  
  5208.  
  5209.  
  5210.  
  5211.          Copyright 1989-1991 by Michael Yam                    Mouser 7-3
  5212.  
  5213.  
  5214.  
  5215.  
  5216.  
  5217.          MPLUS                                                  dev_ready
  5218.  
  5219.  
  5220.          EXAMPLE
  5221.  
  5222.          #include <graph.h>
  5223.          #include <gplus.h>
  5224.          #include <mouser.h>
  5225.  
  5226.          main()
  5227.          {
  5228.              int ch;
  5229.              struct ms_status ms_status;
  5230.              int device;
  5231.  
  5232.              ms_reset();
  5233.              ms_setevent(1);
  5234.              mpsetvideomode( _DEFAULTMODE );
  5235.  
  5236.              /*       Press a key or access mouse.
  5237.               */
  5238.              while( !(device = dev_ready( &ch, &ms_status )) );
  5239.  
  5240.              if( device == _KB )
  5241.                  printf("\nKeyboard pressed.  Code = %x hex\n", ch);
  5242.              else if( device == _MS )
  5243.                  printf("\nMouse pressed or moved.  Mask = %x hex\n",
  5244.                          ms_status.condmask);
  5245.  
  5246.              ms_reset();
  5247.          }
  5248.  
  5249.  
  5250.  
  5251.  
  5252.  
  5253.  
  5254.  
  5255.  
  5256.  
  5257.  
  5258.  
  5259.  
  5260.  
  5261.  
  5262.  
  5263.  
  5264.  
  5265.  
  5266.  
  5267.  
  5268.  
  5269.  
  5270.  
  5271.  
  5272.  
  5273.  
  5274.  
  5275.  
  5276.  
  5277.          Copyright 1989-1991 by Michael Yam                    Mouser 7-4
  5278.  
  5279.  
  5280.  
  5281.  
  5282.  
  5283.          MPLUS                                               ginrectangle
  5284.  
  5285.  
  5286.          SUMMARY
  5287.  
  5288.          #include <graph.h>
  5289.          #include <gplus.h>
  5290.  
  5291.          int ginrectangle(x0,y0,x1,y1,x2,y2);
  5292.          short x0,y0;                 point to check
  5293.          short x1,y1;                 upper left coordinate
  5294.          short x2,y2;                 lower right coordinate
  5295.  
  5296.  
  5297.          DESCRIPTION
  5298.  
  5299.          The ginrectangle() function determines if the point described by
  5300.          (x0,y0) lies inside the rectangle described by (x1,y1,x2,y2).
  5301.          The point in question and the rectangle coordinates may be
  5302.          either physical points or logical points.  For a meaningful
  5303.          comparison, if point (x0,y0) is physical, the rectangle
  5304.          coordinates should be physical.  Likewise, if point (x0,y0) is
  5305.          logical, the rectangle coordinates should also be logical.
  5306.  
  5307.  
  5308.          RETURN VALUE
  5309.  
  5310.          This function returns a 1 if the point is in the rectangle.  A 0
  5311.          is returned if the point is outside the rectangle.
  5312.  
  5313.  
  5314.  
  5315.  
  5316.  
  5317.  
  5318.  
  5319.  
  5320.  
  5321.  
  5322.  
  5323.  
  5324.  
  5325.  
  5326.  
  5327.  
  5328.  
  5329.  
  5330.  
  5331.  
  5332.  
  5333.  
  5334.  
  5335.  
  5336.  
  5337.  
  5338.  
  5339.  
  5340.  
  5341.  
  5342.  
  5343.          Copyright 1989-1991 by Michael Yam                    Mouser 7-5
  5344.  
  5345.  
  5346.  
  5347.  
  5348.  
  5349.          MPLUS                                               ginrectangle
  5350.  
  5351.  
  5352.          EXAMPLE
  5353.  
  5354.          #include <stdio.h>
  5355.          #include <graph.h>
  5356.  
  5357.          #include <gplus.h>
  5358.  
  5359.          main()
  5360.          {
  5361.              short x1,y1,x2,y2;
  5362.  
  5363.              x1 = 80;
  5364.              y1 = 50;
  5365.              x2 = 240;
  5366.              y2 = 150;
  5367.  
  5368.              mpsetvideomode( _MRES4COLOR );
  5369.              _rectangle( _GBORDER, x1, y1, x2, y2 );
  5370.  
  5371.              if( ginrectangle( 80, 50, x1, y1, x2, y2 ) )
  5372.                  printf("point 80, 50 is in the rectangle\n");
  5373.              else
  5374.                  printf("point 80, 50 is not in the rectangle\n");
  5375.  
  5376.              if( ginrectangle( 79, 50, x1, y1, x2, y2 ) )
  5377.                  printf("point 79, 50 is in the rectangle\n");
  5378.              else
  5379.                  printf("point 79, 50 is not in the rectangle\n");
  5380.  
  5381.              getch();                /* strike a key to continue */
  5382.              mpsetvideomode( _DEFAULTMODE );
  5383.          }
  5384.  
  5385.  
  5386.  
  5387.  
  5388.  
  5389.  
  5390.  
  5391.  
  5392.  
  5393.  
  5394.  
  5395.  
  5396.  
  5397.  
  5398.  
  5399.  
  5400.  
  5401.  
  5402.  
  5403.  
  5404.  
  5405.  
  5406.  
  5407.  
  5408.  
  5409.          Copyright 1989-1991 by Michael Yam                    Mouser 7-6
  5410.  
  5411.  
  5412.  
  5413.  
  5414.  
  5415.          MPLUS                                                  ginwindow
  5416.  
  5417.  
  5418.          SUMMARY
  5419.  
  5420.          #include <graph.h>
  5421.          #include <gplus.h>
  5422.  
  5423.          int ginwindow(gwptr,x,y);
  5424.          GWDW *gwptr;                 graphic window pointer
  5425.          short x,y;                   (x,y) coordinate to check
  5426.  
  5427.  
  5428.          DESCRIPTION
  5429.  
  5430.          The function ginwindow() determines whether a point lies inside
  5431.          the specified graphic window or not.  For a meaningful check,
  5432.          the point described by (x,y) must be a physical one, not a
  5433.          logical one.
  5434.  
  5435.  
  5436.          RETURN VALUE
  5437.  
  5438.          This function returns a 1 if the point lies inside the window, a
  5439.          0 if the point is outside the window.
  5440.  
  5441.  
  5442.          EXAMPLE
  5443.  
  5444.          This example creates a button which may be "pushed."  Simply
  5445.          move the cursor into the "push" button, click the left mouse
  5446.          button, and watch for a 3-D effect.
  5447.  
  5448.  
  5449.          #include <stdio.h>
  5450.          #include <graph.h>
  5451.  
  5452.          #include "gplus.h"
  5453.          #include "gscreen.h"
  5454.          #include "mouser.h"
  5455.  
  5456.          main()
  5457.          {
  5458.              int quit, ch, device;
  5459.              struct ms_status ms_status;
  5460.              GWDW *groot;
  5461.              GWDW *gwpush;
  5462.              GWDW *gwquit;
  5463.  
  5464.              mpsetvideomode(_ERESCOLOR);
  5465.  
  5466.              if(ms_reset() == 0)
  5467.              {
  5468.                  printf("\nMouse driver not loaded.\n");
  5469.                  exit(1);
  5470.              }
  5471.              ms_setevent(1);
  5472.              ms_showcursor();
  5473.  
  5474.  
  5475.          Copyright 1989-1991 by Michael Yam                    Mouser 7-7
  5476.  
  5477.  
  5478.  
  5479.  
  5480.  
  5481.          MPLUS                                                  ginwindow
  5482.  
  5483.  
  5484.  
  5485.              groot = groottopen(10, 20, 16, 50, _GFILLINTERIOR,
  5486.                                 BRIGHTWHITE, GREY);
  5487.              _settextposition(5, 1);
  5488.              mpouttext("Click left mouse button", BRIGHTWHITE, -1);
  5489.  
  5490.              gwpush = gwdwtopen(11, 25, 13, 32, _GRAISE, BLACK, WHITE);
  5491.              mpouttext(" PUSH", BLACK, -1);
  5492.  
  5493.              gwquit = gwdwtopen(11, 40, 13, 47, _GRAISE, BLACK, WHITE);
  5494.              mpouttext(" QUIT", BLACK, -1);
  5495.  
  5496.              quit = 0;
  5497.              while(!quit)
  5498.              {
  5499.                  device = dev_ready(&ch, &ms_status);
  5500.                  if(device == _MS)
  5501.                  {
  5502.                      if ((ms_status.condmask & _LBPRESSED) ||
  5503.                          (ms_status.condmask & _LBRELEASED))
  5504.                      {
  5505.                          if (ginwindow(gwpush, ms_status.x, ms_status.y))
  5506.                              physhighlite(gwpush->x1, gwpush->y1,
  5507.                                           gwpush->x2, gwpush->y2);
  5508.                          else if(ginwindow(gwquit, ms_status.x,
  5509.                                                    ms_status.y))
  5510.                          {
  5511.                              physhighlite(gwquit->x1, gwquit->y1,
  5512.                                           gwquit->x2, gwquit->y2);
  5513.                              quit = 1;
  5514.                          }
  5515.                      }
  5516.                  }
  5517.              }
  5518.              ms_reset();
  5519.              gwdwclose(gwpush);
  5520.              gwdwclose(gwquit);
  5521.              grootclose(groot);
  5522.              mpsetvideomode(_DEFAULTMODE);
  5523.          }
  5524.  
  5525.  
  5526.  
  5527.  
  5528.  
  5529.  
  5530.  
  5531.  
  5532.  
  5533.  
  5534.  
  5535.  
  5536.  
  5537.  
  5538.  
  5539.  
  5540.  
  5541.          Copyright 1989-1991 by Michael Yam                    Mouser 7-8
  5542.  
  5543.  
  5544.  
  5545.  
  5546.  
  5547.          MPLUS                                                  ms_cursor
  5548.  
  5549.  
  5550.          SUMMARY
  5551.  
  5552.          #include <mouser.h>
  5553.  
  5554.          int ms_cursor(void);
  5555.  
  5556.  
  5557.          DESCRIPTION
  5558.  
  5559.          The function ms_cursor() returns the status of the mouse cursor.
  5560.  
  5561.  
  5562.          RETURN VALUE
  5563.  
  5564.          This function returns a 1 if the cursor was on, a 0 if the
  5565.          cursor was off.
  5566.  
  5567.  
  5568.          EXAMPLE
  5569.  
  5570.          #include <graph.h>
  5571.          #include <mouser.h>
  5572.  
  5573.          main()
  5574.          {
  5575.              _clearscreen( _GCLEARSCREEN );
  5576.  
  5577.              if( ms_reset() == 0 )
  5578.              {
  5579.                  printf("\nMouse driver not loaded.\n");
  5580.                  exit(1);
  5581.              }
  5582.  
  5583.              if( ms_cursor() == 0 )
  5584.              {
  5585.                  printf("\nCursor is off.\n");
  5586.                  printf("Press a key to turn it on.\n");
  5587.                  getch();
  5588.                  ms_showcursor();
  5589.              }
  5590.  
  5591.              if( ms_cursor() == 1 )
  5592.              {
  5593.                  printf("\nCursor is on.\n");
  5594.                  printf("Press a key to turn it off.\n");
  5595.                  getch();
  5596.                  ms_hidecursor();
  5597.              }
  5598.          }
  5599.  
  5600.  
  5601.  
  5602.  
  5603.  
  5604.  
  5605.  
  5606.  
  5607.          Copyright 1989-1991 by Michael Yam                    Mouser 7-9
  5608.  
  5609.  
  5610.  
  5611.  
  5612.  
  5613.          MPLUS                                             ms_getposition
  5614.  
  5615.  
  5616.          SUMMARY
  5617.  
  5618.          #include <mouser.h>
  5619.  
  5620.          void ms_getposition(x,y,left,right)
  5621.          short *x,*y;                 physical x,y coordinate of cursor position
  5622.          int *left;                   status of the left button
  5623.          int *right;                  status of the right button;
  5624.  
  5625.  
  5626.          DESCRIPTION
  5627.  
  5628.          The ms_getposition() function gets the mouse cursor position and
  5629.          the status of its buttons.  The x,y coordinate is physical and
  5630.          will be correct for high resolution as well as medium resolution
  5631.          graphics modes.
  5632.  
  5633.          The "left" argument will be set to 0 if the left button is up,
  5634.          and 1 if the left button is down.
  5635.  
  5636.          The "right" parameter will be set to 0 if the right button is
  5637.          up, and 1 if the right button is down.
  5638.  
  5639.  
  5640.          RETURN VALUE
  5641.  
  5642.          None.
  5643.  
  5644.  
  5645.  
  5646.  
  5647.  
  5648.  
  5649.  
  5650.  
  5651.  
  5652.  
  5653.  
  5654.  
  5655.  
  5656.  
  5657.  
  5658.  
  5659.  
  5660.  
  5661.  
  5662.  
  5663.  
  5664.  
  5665.  
  5666.  
  5667.  
  5668.  
  5669.  
  5670.  
  5671.  
  5672.  
  5673.          Copyright 1989-1991 by Michael Yam                   Mouser 7-10
  5674.  
  5675.  
  5676.  
  5677.  
  5678.  
  5679.          MPLUS                                             ms_getposition
  5680.  
  5681.  
  5682.          EXAMPLE
  5683.  
  5684.          #include <graph.h>
  5685.          #include <mouser.h>
  5686.          #include <gplus.h>
  5687.  
  5688.          main()
  5689.          {
  5690.              short x, y;
  5691.              int left, right;
  5692.  
  5693.              mpsetvideomode ( _ERESCOLOR );
  5694.  
  5695.              if( ms_reset() == 0 )
  5696.              {
  5697.                  printf("\nMouse driver not loaded.\n");
  5698.                  exit(1);
  5699.              }
  5700.  
  5701.              ms_showcursor();
  5702.              ms_getposition( &x, &y, &left, &right );
  5703.              printf("\nCursor is at %d, %d\n", x, y );
  5704.              printf("Press a key...");
  5705.              getch();
  5706.  
  5707.              ms_setposition( 0, 0 );
  5708.              ms_getposition( &x, &y, &left, &right );
  5709.              printf("\nCursor is at %d, %d\n", x, y );
  5710.              printf("Press a key...");
  5711.              getch();
  5712.  
  5713.              ms_reset();
  5714.              mpsetvideomode( _DEFAULTMODE );
  5715.              return 0;
  5716.          }
  5717.  
  5718.  
  5719.  
  5720.  
  5721.  
  5722.  
  5723.  
  5724.  
  5725.  
  5726.  
  5727.  
  5728.  
  5729.  
  5730.  
  5731.  
  5732.  
  5733.  
  5734.  
  5735.  
  5736.  
  5737.  
  5738.  
  5739.          Copyright 1989-1991 by Michael Yam                   Mouser 7-11
  5740.  
  5741.  
  5742.  
  5743.  
  5744.  
  5745.          MPLUS                                                ms_getpress
  5746.  
  5747.  
  5748.          SUMMARY
  5749.  
  5750.          #include <mouser.h>
  5751.  
  5752.          int ms_getpress(button,bstatus,bpress,x,y);
  5753.          int button;                  button to check (left or right)
  5754.          int *bstatus;                status of the button
  5755.          int *bpress;                 number of times button was pressed
  5756.                                       since last call
  5757.          short *x,*y;                 cursor position, physical
  5758.                                       coordinate
  5759.  
  5760.  
  5761.          DESCRIPTION
  5762.  
  5763.          The function ms_getpress() retrieves the status of the specified
  5764.          button, the number of times it was pressed since this function
  5765.          was called, and position of the cursor at the last time the
  5766.          specified button was pressed.
  5767.  
  5768.          Two constants are defined in mouser.h to specify the button to
  5769.          test:
  5770.  
  5771.              Constant                 Meaning
  5772.              -------------------------------------
  5773.              MSLBTN                   left button
  5774.              MSRBTN                   right button
  5775.  
  5776.          The status returned will be 0 if the button was up, and 1 if the
  5777.          button was down.  The number of button presses can range from 0
  5778.          to 32767.  Overflow is not detected.  After the call, the value
  5779.          is set to 0.  The x,y coordinate corresponds to the cursor's
  5780.          position at the time the button was last pressed; it does not
  5781.          necessarily correspond to the cursor's current position.
  5782.  
  5783.  
  5784.          RETURN VALUE
  5785.  
  5786.          This function returns and integer containing the number of times
  5787.          the specified button was pressed since the last call.
  5788.  
  5789.  
  5790.  
  5791.  
  5792.  
  5793.  
  5794.  
  5795.  
  5796.  
  5797.  
  5798.  
  5799.  
  5800.  
  5801.  
  5802.  
  5803.  
  5804.  
  5805.          Copyright 1989-1991 by Michael Yam                   Mouser 7-12
  5806.  
  5807.  
  5808.  
  5809.  
  5810.  
  5811.          MPLUS                                                ms_getpress
  5812.  
  5813.  
  5814.          EXAMPLE
  5815.  
  5816.          #include <graph.h>
  5817.          #include <mouser.h>
  5818.          #include <gplus.h>
  5819.  
  5820.          main()
  5821.          {
  5822.              int bstatus;
  5823.              int bpress;
  5824.              int brelease;
  5825.              short x,y;
  5826.  
  5827.              mpsetvideomode( _ERESCOLOR );
  5828.  
  5829.              if( ms_reset() == 0 )
  5830.              {
  5831.                  printf("\nMouse driver not loaded.\n");
  5832.                  exit(1);
  5833.              }
  5834.              ms_showcursor();
  5835.  
  5836.              printf("\nPress the left mouse button a few times.\n");
  5837.              printf("\nPress a keyboard key when done...\n");
  5838.              getch();
  5839.  
  5840.              ms_getpress( MSLBTN, &bstatus, &bpress, &x, &y );
  5841.              ms_getrelease( MSLBTN, &bstatus, &brelease, &x, &y );
  5842.  
  5843.              printf("Left button was pressed %d times.\n", bpress );
  5844.              printf("Left button was released %d times.\n", brelease );
  5845.  
  5846.              printf("\nPress a key...");
  5847.              getch();
  5848.  
  5849.              ms_reset();
  5850.              mpsetvideomode( _DEFAULTMODE );
  5851.              return 0;
  5852.          }
  5853.  
  5854.  
  5855.  
  5856.  
  5857.  
  5858.  
  5859.  
  5860.  
  5861.  
  5862.  
  5863.  
  5864.  
  5865.  
  5866.  
  5867.  
  5868.  
  5869.  
  5870.  
  5871.          Copyright 1989-1991 by Michael Yam                   Mouser 7-13
  5872.  
  5873.  
  5874.  
  5875.  
  5876.  
  5877.          MPLUS                                              ms_getrelease
  5878.  
  5879.  
  5880.          SUMMARY
  5881.  
  5882.          #include <mouser.h>
  5883.  
  5884.          int ms_getrelease(button,bstatus,brelease,x,y);
  5885.          int button;                  button to check (left or right)
  5886.          int *bstatus;                status of the button
  5887.          int *brelease;               number of times button was released
  5888.                                       since last call
  5889.          short *x,*y;                 cursor position
  5890.  
  5891.  
  5892.          DESCRIPTION
  5893.  
  5894.          The function ms_getrelease() retrieves the status of the
  5895.          specified button, the number of times it was released since this
  5896.          function was called, and the position of the cursor at the last
  5897.          time the specified button was released.
  5898.  
  5899.          Two constants are defined in mouser.h to specify the button to
  5900.          test:
  5901.  
  5902.              Constant                 Meaning
  5903.              -------------------------------------
  5904.              MSLBTN                   left button
  5905.              MSRBTN                   right button
  5906.  
  5907.          The status returned will be 0 if the button was up, and 1 if the
  5908.          button was down.  The number of button releases can range from 0
  5909.          to 32767.  Overflow is not detected.  After the call, the value
  5910.          is set to 0.  The x,y coordinate corresponds to the cursor's
  5911.          position at the time the button was last released; it does not
  5912.          necessarily correspond to the cursor's current position.
  5913.  
  5914.  
  5915.          RETURN VALUE
  5916.  
  5917.          This function returns and integer containing the number of times
  5918.          the specified button was released since the last call.
  5919.  
  5920.  
  5921.          EXAMPLE
  5922.  
  5923.          See ms_getpress().
  5924.  
  5925.  
  5926.  
  5927.  
  5928.  
  5929.  
  5930.  
  5931.  
  5932.  
  5933.  
  5934.  
  5935.  
  5936.  
  5937.          Copyright 1989-1991 by Michael Yam                   Mouser 7-14
  5938.  
  5939.  
  5940.  
  5941.  
  5942.  
  5943.          MPLUS                                              ms_hidecursor
  5944.  
  5945.  
  5946.          SUMMARY
  5947.  
  5948.          #include <mouser.h>
  5949.  
  5950.          void ms_hidecursor(void);
  5951.  
  5952.  
  5953.          DESCRIPTION
  5954.  
  5955.          The ms_hidecursor() function hides the mouse cursor.  Although
  5956.          it cannot be seen on the screen, the cursor still tracks any
  5957.          mouse motion.
  5958.  
  5959.          The cursor should be hidden any time the screen is read from or
  5960.          written to.
  5961.  
  5962.  
  5963.          RETURN VALUE
  5964.  
  5965.          None.
  5966.  
  5967.  
  5968.          EXAMPLE
  5969.  
  5970.          See ms_cursor().
  5971.  
  5972.  
  5973.  
  5974.  
  5975.  
  5976.  
  5977.  
  5978.  
  5979.  
  5980.  
  5981.  
  5982.  
  5983.  
  5984.  
  5985.  
  5986.  
  5987.  
  5988.  
  5989.  
  5990.  
  5991.  
  5992.  
  5993.  
  5994.  
  5995.  
  5996.  
  5997.  
  5998.  
  5999.  
  6000.  
  6001.  
  6002.  
  6003.          Copyright 1989-1991 by Michael Yam                   Mouser 7-15
  6004.  
  6005.  
  6006.  
  6007.  
  6008.  
  6009.          MPLUS                                                    ms_poll
  6010.  
  6011.  
  6012.          SUMMARY
  6013.  
  6014.          #include <mouser.h>
  6015.  
  6016.          int ms_poll(ms_status);
  6017.          struct ms_status *ms_status;
  6018.  
  6019.  
  6020.          DESCRIPTION
  6021.  
  6022.          The ms_poll() function polls the status of the mouse and stores
  6023.          it in the structure "ms_status." Since this function polls the
  6024.          mouse, "condmask" will be incorrect.  "condmask" is valid only
  6025.          for dev_ready().
  6026.  
  6027.          This function may be used in place of dev_ready() when a program
  6028.          receives input solely from a mouse (and not from the keyboard).
  6029.  
  6030.  
  6031.          RETURN VALUE
  6032.  
  6033.          The function returns the constant _MS.
  6034.  
  6035.  
  6036.          EXAMPLE
  6037.  
  6038.          #include <graph.h>
  6039.          #include <gplus.h>
  6040.          #include <mouser.h>
  6041.  
  6042.          main()
  6043.          {
  6044.              struct ms_status ms_status;
  6045.  
  6046.              mpsetvideomode( _ERESCOLOR );
  6047.  
  6048.              if( ms_reset() == 0 )
  6049.              {
  6050.                  printf("\nMouse driver not loaded.\n");
  6051.                  exit(1);
  6052.              }
  6053.              printf("Press right button to quit...");
  6054.  
  6055.              ms_showcursor();
  6056.              while(1)
  6057.              {
  6058.                  ms_poll( &ms_status );
  6059.                  if( ms_status.rbtn )
  6060.                      break;
  6061.              }
  6062.              ms_reset();
  6063.              mpsetvideomode( _DEFAULTMODE );
  6064.              return 0;
  6065.          }
  6066.  
  6067.  
  6068.  
  6069.          Copyright 1989-1991 by Michael Yam                   Mouser 7-16
  6070.  
  6071.  
  6072.  
  6073.  
  6074.  
  6075.          MPLUS                                                   ms_ready
  6076.  
  6077.  
  6078.          SUMMARY
  6079.  
  6080.          #include <mouser.h>
  6081.  
  6082.          unsigned int ms_ready(void);
  6083.  
  6084.  
  6085.          DESCRIPTION
  6086.  
  6087.          The ms_ready() function determines whether there is mouse input
  6088.          waiting or not.  Mouse event checking must be enabled with:
  6089.  
  6090.              ms_setevent(1);
  6091.  
  6092.          When the mouse is moved or any of its buttons pressed or
  6093.          released, an interrupt is generated.
  6094.  
  6095.  
  6096.          RETURN VALUE
  6097.  
  6098.          This function returns a 0 if no mouse activity was detected.  If
  6099.          there was any activity, a bit mask is returned.  Manifest
  6100.          constants for these masks are defined in mouser.h and described
  6101.          table 7-1 at the beginning of this chapter.
  6102.  
  6103.  
  6104.  
  6105.  
  6106.  
  6107.  
  6108.  
  6109.  
  6110.  
  6111.  
  6112.  
  6113.  
  6114.  
  6115.  
  6116.  
  6117.  
  6118.  
  6119.  
  6120.  
  6121.  
  6122.  
  6123.  
  6124.  
  6125.  
  6126.  
  6127.  
  6128.  
  6129.  
  6130.  
  6131.  
  6132.  
  6133.  
  6134.  
  6135.          Copyright 1989-1991 by Michael Yam                   Mouser 7-17
  6136.  
  6137.  
  6138.  
  6139.  
  6140.  
  6141.          MPLUS                                                   ms_ready
  6142.  
  6143.  
  6144.          EXAMPLE
  6145.  
  6146.          #include <graph.h>
  6147.          #include <gplus.h>
  6148.          #include <mouser.h>
  6149.  
  6150.          main()
  6151.          {
  6152.              int ch;
  6153.              struct ms_status ms_status;
  6154.              unsigned int mask;
  6155.  
  6156.              if( ms_reset() == 0 )
  6157.              {
  6158.                  printf("\nMouse driver not loaded.\n");
  6159.                  exit(1);
  6160.              }
  6161.              mpsetvideomode( _DEFAULTMODE );
  6162.  
  6163.              ms_setevent(1);
  6164.              printf("\nMove the mouse or press its buttons...\n");
  6165.              while( !(mask=ms_ready()) );
  6166.              printf("\nMask = %u\n", mask );
  6167.  
  6168.              ms_setevent(0);
  6169.              printf("\nMouse response should be dead now.\n");
  6170.              printf("\nTry the mouse.  Press a keyboard key to quit...\n");
  6171.              while( !dev_ready( &ch, &ms_status ) );
  6172.  
  6173.              ms_reset();
  6174.          }
  6175.  
  6176.  
  6177.  
  6178.  
  6179.  
  6180.  
  6181.  
  6182.  
  6183.  
  6184.  
  6185.  
  6186.  
  6187.  
  6188.  
  6189.  
  6190.  
  6191.  
  6192.  
  6193.  
  6194.  
  6195.  
  6196.  
  6197.  
  6198.  
  6199.  
  6200.  
  6201.          Copyright 1989-1991 by Michael Yam                   Mouser 7-18
  6202.  
  6203.  
  6204.  
  6205.  
  6206.  
  6207.          MPLUS                                                   ms_reset
  6208.  
  6209.  
  6210.          SUMMARY
  6211.  
  6212.          #include <mouser.h>
  6213.  
  6214.          int ms_reset(void);
  6215.  
  6216.  
  6217.          DESCRIPTION
  6218.  
  6219.          The function ms_reset() resets the mouse driver as follows:
  6220.  
  6221.              -- cursor is positioned to screen's center
  6222.              -- the cursor is hidden
  6223.              -- MPLUS' internal cursor flag is set to 0 (0 = off, 1 = on)
  6224.              -- interrupt call mask is 0 (no interrupt subroutine
  6225.                 specified)
  6226.              -- MPLUS' mouse event checking is disabled
  6227.                 ( ms_setevent(0) )
  6228.              -- light pen emulation enabled
  6229.              -- horizontal mickey/pixel ratio:  8 to 8
  6230.              -- vertical mickey/pixel ratio: 16 to 8
  6231.              -- boundary for cursor is set to the screen's physical
  6232.                 coordinates
  6233.              -- CRT page number is 0
  6234.  
  6235.  
  6236.          When programming the mouse, this function should be called at
  6237.          the start of your program and at the end of your program.
  6238.  
  6239.  
  6240.          RETURN VALUE
  6241.  
  6242.          This function returns a 0 if there is no mouse hardware or
  6243.          software installed.  If a mouse is properly installed, the
  6244.          number of buttons on the mouse is returned.
  6245.  
  6246.  
  6247.          EXAMPLE
  6248.  
  6249.          #include <mouser.h>
  6250.  
  6251.          main()
  6252.          {
  6253.              int ret;
  6254.  
  6255.              ret = ms_reset();
  6256.  
  6257.              if( ret == 0 )
  6258.                  printf("\nMouse driver not loaded.");
  6259.              else
  6260.                  printf("\nMouse has %d buttons.", ret );
  6261.          }
  6262.  
  6263.  
  6264.  
  6265.  
  6266.  
  6267.          Copyright 1989-1991 by Michael Yam                   Mouser 7-19
  6268.  
  6269.  
  6270.  
  6271.  
  6272.  
  6273.          MPLUS                                                ms_setevent
  6274.  
  6275.  
  6276.          SUMMARY
  6277.  
  6278.          #include <mouser.h>
  6279.  
  6280.          void ms_setevent(flag);
  6281.  
  6282.  
  6283.          DESCRIPTION
  6284.  
  6285.          The ms_setevent() function enables or disables mouse event
  6286.          checking.  Setting "flag" to 1 enables an interrupt routine
  6287.          which allows the functions dev_ready() and ms_ready() to
  6288.          operate.
  6289.  
  6290.          Setting "flag" to zero diables mouse event checking in which
  6291.          case the mouse will never appear ready to dev_ready() and
  6292.          ms_ready().
  6293.  
  6294.          Be sure to disable checking when leaving your program.  This may
  6295.          be accomplished with either ms_setevent(0) or ms_reset().
  6296.  
  6297.  
  6298.          RETURN VALUE
  6299.  
  6300.          None.
  6301.  
  6302.  
  6303.          EXAMPLE
  6304.  
  6305.          See ms_ready().
  6306.  
  6307.  
  6308.  
  6309.  
  6310.  
  6311.  
  6312.  
  6313.  
  6314.  
  6315.  
  6316.  
  6317.  
  6318.  
  6319.  
  6320.  
  6321.  
  6322.  
  6323.  
  6324.  
  6325.  
  6326.  
  6327.  
  6328.  
  6329.  
  6330.  
  6331.  
  6332.  
  6333.          Copyright 1989-1991 by Michael Yam                   Mouser 7-20
  6334.  
  6335.  
  6336.  
  6337.  
  6338.  
  6339.          MPLUS                                             ms_setposition
  6340.  
  6341.  
  6342.          SUMMARY
  6343.  
  6344.          #include <mouser.h>
  6345.  
  6346.          void ms_setposition(x,y);
  6347.          short x,y;                   screen location to place the cursor
  6348.  
  6349.  
  6350.          DESCRIPTION
  6351.  
  6352.          The function ms_setposition() positions the cursor to the
  6353.          physical coordinate x,y.
  6354.  
  6355.  
  6356.          RETURN VALUE
  6357.  
  6358.          None.
  6359.  
  6360.  
  6361.          EXAMPLE
  6362.  
  6363.          See ms_getposition().
  6364.  
  6365.  
  6366.  
  6367.  
  6368.  
  6369.  
  6370.  
  6371.  
  6372.  
  6373.  
  6374.  
  6375.  
  6376.  
  6377.  
  6378.  
  6379.  
  6380.  
  6381.  
  6382.  
  6383.  
  6384.  
  6385.  
  6386.  
  6387.  
  6388.  
  6389.  
  6390.  
  6391.  
  6392.  
  6393.  
  6394.  
  6395.  
  6396.  
  6397.  
  6398.  
  6399.          Copyright 1989-1991 by Michael Yam                   Mouser 7-21
  6400.  
  6401.  
  6402.  
  6403.  
  6404.  
  6405.          MPLUS                                              ms_showcursor
  6406.  
  6407.  
  6408.          SUMMARY
  6409.  
  6410.          #include <mouser.h>
  6411.  
  6412.          void ms_showcursor(void);
  6413.  
  6414.  
  6415.          DESCRIPTION
  6416.  
  6417.          The function ms_showcursor() displays the mouse cursor on the
  6418.          screen.
  6419.  
  6420.  
  6421.          RETURN VALUE
  6422.  
  6423.          None.
  6424.  
  6425.  
  6426.          EXAMPLE
  6427.  
  6428.          See ms_cursor().
  6429.  
  6430.  
  6431.  
  6432.  
  6433.  
  6434.  
  6435.  
  6436.  
  6437.  
  6438.  
  6439.  
  6440.  
  6441.  
  6442.  
  6443.  
  6444.  
  6445.  
  6446.  
  6447.  
  6448.  
  6449.  
  6450.  
  6451.  
  6452.  
  6453.  
  6454.  
  6455.  
  6456.  
  6457.  
  6458.  
  6459.  
  6460.  
  6461.  
  6462.  
  6463.  
  6464.  
  6465.          Copyright 1989-1991 by Michael Yam                   Mouser 7-22
  6466.  
  6467.  
  6468.  
  6469.  
  6470.  
  6471.          MPLUS                                                  ms_window
  6472.  
  6473.  
  6474.          SUMMARY
  6475.  
  6476.          #include <mouser.h>
  6477.  
  6478.          void ms_window(x1,y1,x2,y2);
  6479.          short x1,y1;                 upper left corner
  6480.          short x2,y2;                 lower right corner
  6481.  
  6482.          DESCRIPTION
  6483.  
  6484.          The ms_window() function retricts the motion of the mouse to a
  6485.          window on a screen bounded by the rectangle "x1,y1,x2,y2."  The
  6486.          coordinates are physical ones.
  6487.  
  6488.  
  6489.          RETURN VALUE
  6490.  
  6491.          None.
  6492.  
  6493.  
  6494.          EXAMPLE
  6495.  
  6496.          #include <graph.h>
  6497.          #include <mouser.h>
  6498.          #include <gplus.h>
  6499.  
  6500.          main()
  6501.          {
  6502.              mpsetvideomode( _ERESCOLOR );
  6503.  
  6504.              if( ms_reset() == 0 )
  6505.              {
  6506.                  printf("\nMouse driver not loaded.\n");
  6507.                  exit(1);
  6508.              }
  6509.              ms_showcursor();
  6510.  
  6511.              _rectangle( _GBORDER, 100, 50, 400, 200 );
  6512.              ms_window( 100, 50, 400, 200 );
  6513.  
  6514.              _settextposition( 22, 1 );
  6515.              _outtext("Mouse motion is restricted to rectangle.\n");
  6516.              _outtext("Press a key to quit...");
  6517.              getch();
  6518.  
  6519.              ms_reset();
  6520.              mpsetvideomode( _DEFAULTMODE );
  6521.          }
  6522.  
  6523.  
  6524.  
  6525.  
  6526.  
  6527.  
  6528.  
  6529.  
  6530.  
  6531.          Copyright 1989-1991 by Michael Yam                   Mouser 7-23
  6532.  
  6533.  
  6534.  
  6535.  
  6536.  
  6537.        MPLUS                                             FUNCTION INDEX
  6538.  
  6539.  
  6540.  
  6541.  
  6542.  
  6543.  
  6544.  
  6545.        APPENDIX A
  6546.        ----------
  6547.  
  6548.  
  6549.        FUNCTION INDEX
  6550.  
  6551.  
  6552.  
  6553.  
  6554.  
  6555.             dev_ready()      7-3              mpgetimage()        5-8
  6556.             gdclose()        4-3              mpinput()           2-3
  6557.             gdialog()        4-4              mpmemavl()          2-5
  6558.             gdprompt()       4-6              mpoutchar()         2-6
  6559.             gdwrite()        4-7              mpoutgtext()        2-9
  6560.             ginrectangle()   7-5              mpouttext()         2-7
  6561.             ginwindow()      7-7              mpputimage()        5-10
  6562.             gpickup()        5-3              mpsetvideomode()    2-11
  6563.             gputdown()       5-5              mpwordwrap()        2-13
  6564.             grootclose()     3-4              ms_cursor()         7-9
  6565.             grootopen()      3-5              ms_getposition()    7-10
  6566.             groottopen()     3-6              ms_getpress()       7-12
  6567.             gwdwclose()      3-7              ms_getrelease()     7-14
  6568.             gwdwclr()        3-8              ms_hidecursor()     7-15
  6569.             gwdwgetactv()    3-9              ms_poll()           7-16
  6570.             gwdwgetorg()     3-10             ms_ready()          7-17
  6571.             gwdwopen()       3-12             ms_reset()          7-19
  6572.             gwdwsetactv()    3-13             ms_setevent()       7-20
  6573.             gwdwsetorg()     3-14             ms_setposition()    7-21
  6574.             gwdwtopen()      3-15             ms_showcursor()     7-22
  6575.             loghighlite()    5-6              ms_window()         7-23
  6576.             mb_close()       6-4              physhighlite()      5-11
  6577.             mb_hide()        6-5              xorline()           5-12
  6578.             mb_open()        6-6              xorpt()             5-14
  6579.             mb_run()         6-8
  6580.             mb_setbits()     6-9
  6581.             mb_show()        6-10
  6582.             mb_stdcolors()   6-11
  6583.  
  6584.  
  6585.  
  6586.  
  6587.  
  6588.  
  6589.  
  6590.  
  6591.  
  6592.  
  6593.  
  6594.  
  6595.  
  6596.  
  6597.          Copyright 1989-1991 by Michael Yam           Function Index  A-1
  6598.  
  6599.  
  6600.  
  6601.  
  6602.  
  6603.          MPLUS                                           REVISION HISTORY
  6604.  
  6605.  
  6606.  
  6607.  
  6608.  
  6609.  
  6610.  
  6611.          APPENDIX B
  6612.          ----------
  6613.  
  6614.  
  6615.          REVISION HISTORY
  6616.  
  6617.  
  6618.          Version 1.5  December 1, 1991
  6619.          -----------------------------
  6620.          This version introduces a few new functions:
  6621.  
  6622.          1)  mpinput() for retrieving keyboard data.  As many of you
  6623.              pointed out, input functions like scanf() did not honor the
  6624.              background color in graphics mode.  This routine overcomes
  6625.              that problem.
  6626.  
  6627.          2)  mpoutgtext() for displaying MSC 6.0 fonts.
  6628.  
  6629.          3)  mpoutchar() for cases when mpouttext() was overkill.
  6630.  
  6631.          4)  mb_hide() and mb_show() to hide and show the menu bar.
  6632.  
  6633.  
  6634.          Version 1.41  June 1, 1991
  6635.          --------------------------
  6636.          This is a maintenance upgrade consisting of minor changes:
  6637.  
  6638.          1)  minor internal improvements.
  6639.  
  6640.          2)  MPDEMO.EXE illustrates MPLUS' compatibility with MSC 6.0
  6641.              fonts.
  6642.  
  6643.          3)  Prior to this version, the shareware edition of MPLUS
  6644.              provided only the small model library.  Since this didn't
  6645.              allow for a thorough evaluation of MPLUS, the shareware
  6646.              edition now comes with all four memory models (S,M,C,L).
  6647.  
  6648.  
  6649.  
  6650.  
  6651.  
  6652.  
  6653.  
  6654.  
  6655.  
  6656.  
  6657.  
  6658.  
  6659.  
  6660.  
  6661.  
  6662.  
  6663.          Copyright 1989-1991 by Michael Yam         Revision History  B-1
  6664.  
  6665.  
  6666.  
  6667.  
  6668.  
  6669.          MPLUS                                           REVISION HISTORY
  6670.  
  6671.  
  6672.          Version 1.4  February 1, 1991
  6673.          -----------------------------
  6674.          1)  Menu system now supports hot keys and menu marks (sometimes
  6675.              referred to as checkmarks).  See chapter 6 and MENUDEMO.C
  6676.              for details.
  6677.  
  6678.          2)  New function: mb_setbits().  This function allows you to
  6679.              enable or disable menu attributes.
  6680.  
  6681.          3)  New function: mpmemavl().  This function returns the number
  6682.              of kilobytes available.  When programming in the compact and
  6683.              large memory models, it determines the amount of
  6684.              conventional memory free (RAM between 0 and 640 kb).
  6685.  
  6686.  
  6687.          Version 1.31  October 1, 1990
  6688.          -----------------------------
  6689.          1)  Version 1.3 introduced a problem when using the Logitech
  6690.              mouse.  The menu system didn't always detect the "button
  6691.              release" condition.  This has been fixed.
  6692.  
  6693.          2)  Version 1.3 required that all menu bar selections have a
  6694.              submenu.  This is no longer necessary; a function may be
  6695.              executed directly from the bar.
  6696.  
  6697.  
  6698.          Version 1.3  September 1, 1990
  6699.          ------------------------------
  6700.          1)  Function name changes:
  6701.  
  6702.                   Old            New
  6703.                   -----------------------------
  6704.                   outtext()      mpouttext()
  6705.                   setvideomode() mpsetvideomode()
  6706.                   getimage()     mpgetimage()
  6707.                   putimage()     mpputimage()
  6708.  
  6709.  
  6710.              The "mp" prefix was added to avoid possible naming
  6711.              collisions when using MPLUS with other libraries.  Code
  6712.              using the old names will still compile because of the macros
  6713.              in "gplus.h", but use the new names to ensure future
  6714.              compatibility with MPLUS.
  6715.  
  6716.          2)  New function: mpwordwrap().  This enables or disables word
  6717.              wrap when using mpouttext().
  6718.  
  6719.          3)  Revamped menu system.  Now supports "greyout" and up to 5
  6720.              levels of submenus.  See Chapter 6 for details.
  6721.  
  6722.          4)  Text scrolling now supported for graphic windows opened with
  6723.              gwdwopen() and grootopen().
  6724.  
  6725.  
  6726.  
  6727.  
  6728.  
  6729.          Copyright 1989-1991 by Michael Yam         Revision History  B-2
  6730.  
  6731.  
  6732.  
  6733.  
  6734.  
  6735.          MPLUS                                           REVISION HISTORY
  6736.  
  6737.  
  6738.          Version 1.2  May 1, 1990
  6739.          ------------------------
  6740.          1)  Two new graphic window types were added to simulate depth:
  6741.  
  6742.                   _GRAISE - a raised graphic window.
  6743.                   _GSINK - a sunken graphic window.
  6744.  
  6745.              These constants are defined in GPLUS.H.
  6746.  
  6747.          2)  The prompt regions in the dialogue boxes were a wee bit
  6748.              small for the mouse to easily "home" in.  They have been
  6749.              padded out with spaces to enlarge them.
  6750.  
  6751.          3)  Dialogue boxes now recognize the "Enter" and "Esc" keys.
  6752.  
  6753.          4)  A new bar menu function was added: bm_exit().  This gives
  6754.              the user a "hot" key to exit the bar menu.
  6755.  
  6756.          5)  The option to purchase source code is now available.
  6757.  
  6758.  
  6759.          Version 1.1  January 1, 1990
  6760.          ----------------------------
  6761.          1)  Improved the use of memory when opening graphic windows.  In
  6762.              version 1.0 the memory may have been actually available but
  6763.              unusable due to fragmentation.  Version 1.1 is "smart"
  6764.              enough to use that fragmented memory; now more and larger
  6765.              graphic windows may be opened at a time.
  6766.  
  6767.          2)  A cosmetic change was made to the bar menu function
  6768.              bm_show().  The titles in the bar used to be centered in
  6769.              logical fields, but when titles which varied greatly in
  6770.              length were displayed, the menu appeared off-balanced.  Bar
  6771.              menu titles are now left justified and separated by 4
  6772.              spaces.
  6773.  
  6774.          3)  The demo program MPDEMO.EXE was introduced.
  6775.  
  6776.  
  6777.          Version 1.0  September 1, 1989
  6778.          ------------------------------
  6779.          MPLUS is born.
  6780.  
  6781.  
  6782.  
  6783.  
  6784.  
  6785.  
  6786.  
  6787.  
  6788.  
  6789.  
  6790.  
  6791.  
  6792.  
  6793.  
  6794.  
  6795.          Copyright 1989-1991 by Michael Yam         Revision History  B-3
  6796.  
  6797.  
  6798.  
  6799.  
  6800.  
  6801.          MPLUS                                  LIBRARY INCOMPATIBILITIES
  6802.  
  6803.  
  6804.  
  6805.  
  6806.  
  6807.  
  6808.  
  6809.          APPENDIX C
  6810.          ----------
  6811.  
  6812.  
  6813.          LIBRARY INCOMPATIBILITIES
  6814.  
  6815.          Certain calls to Microsoft's GRAPHICS library can confuse MPLUS.
  6816.          The side effects of using Microsoft's _outtext() and
  6817.          _setvideomode() functions have already been discussed in Chapter
  6818.          2, "Graphic Support."  Presented here are other Microsoft
  6819.          functions you should use carefully, if at all.
  6820.  
  6821.  
  6822.          _getimage(), _putimage()
  6823.          ------------------------
  6824.  
  6825.          These functions do not recognize the presence of a mouse.  A
  6826.          visible cursor will interfere with the "putting" and "getting"
  6827.          of the screen image.
  6828.  
  6829.          If your application uses a mouse, then MPLUS' mpputimage() and
  6830.          mpgetimage() is recommended.
  6831.  
  6832.  
  6833.          _remapallpalette(), _remappalette(), _setbkcolor()
  6834.          --------------------------------------------------
  6835.  
  6836.          The #defines in GSCREEN.H are not universal and are valid only
  6837.          for the default palette and background.  Remapping the palette
  6838.          or setting the background color will render the #defines
  6839.          incorrect.  Consequently, you will need to write your own
  6840.          #defines which map to your new colors.
  6841.  
  6842.          These Microsoft functions will also alter the colors used by the
  6843.          dialogue boxes.  For now, the only way to preserve the colors is
  6844.          to avoid remapping BLUE, WHITE, BRIGHTWHITE, BLACK, RED, and
  6845.          YELLOW.
  6846.  
  6847.          If you simply desire a new background color instead of an
  6848.          entirely new palette, see grootopen() or use the code fragment
  6849.          below:
  6850.  
  6851.              _setcolor( background );
  6852.              _rectangle( _GFILLINTERIOR, 0, 0,
  6853.                          _videoconfig.numxpixels-1,
  6854.                          _videoconfig.numypixels-1 );
  6855.  
  6856.  
  6857.          This paints the entire screen with the color of your choice.
  6858.  
  6859.  
  6860.  
  6861.          Copyright 1989-1991 by Michael Yam Library Incompatibilities  C-1
  6862.  
  6863.  
  6864.  
  6865.  
  6866.  
  6867.          MPLUS                                  LIBRARY INCOMPATIBILITIES
  6868.  
  6869.  
  6870.          _settextwindow(), _setviewport()
  6871.          --------------------------------
  6872.  
  6873.          These functions generally shouldn't be needed since MPLUS
  6874.          provides graphic windows (see gwdwopen() in Chapter 3).  If you
  6875.          open a graphic window and then call _setviewport() or
  6876.          _settextwindow(), you will lose the graphic window because
  6877.          you've altered the output region.
  6878.  
  6879.          The graphic window may be recovered by setting it active again
  6880.          with:
  6881.  
  6882.              gwdwsetactv( gwptr );
  6883.  
  6884.  
  6885.  
  6886.  
  6887.  
  6888.  
  6889.  
  6890.  
  6891.  
  6892.  
  6893.  
  6894.  
  6895.  
  6896.  
  6897.  
  6898.  
  6899.  
  6900.  
  6901.  
  6902.  
  6903.  
  6904.  
  6905.  
  6906.  
  6907.  
  6908.  
  6909.  
  6910.  
  6911.  
  6912.  
  6913.  
  6914.  
  6915.  
  6916.  
  6917.  
  6918.  
  6919.  
  6920.  
  6921.  
  6922.  
  6923.  
  6924.  
  6925.  
  6926.  
  6927.          Copyright 1989-1991 by Michael Yam Library Incompatibilities  C-2
  6928.  
  6929.  
  6930.  
  6931.  
  6932.  
  6933.          MPLUS                                          ABOUT SOURCE CODE
  6934.  
  6935.  
  6936.  
  6937.  
  6938.  
  6939.  
  6940.  
  6941.          APPENDIX D
  6942.          ----------
  6943.  
  6944.  
  6945.          ABOUT SOURCE CODE
  6946.  
  6947.          This section is for those interested in working with the source
  6948.          code.
  6949.  
  6950.  
  6951.          The Make Files
  6952.          --------------
  6953.  
  6954.              MPLUS.MAK                For MSC 5.x MAKE utility.
  6955.              MPLUS.NMK                For MSC 6.0 NMAKE uitlity.  Rename
  6956.                                       to "makefile" if you prefer.
  6957.  
  6958.  
  6959.          To build a model of the MPLUS Graphic Interface Library, you
  6960.          require the following:
  6961.  
  6962.              Microsoft C Compiler 5.x or 6.0.
  6963.              Microsoft Macro Assembler 4.x or Turbo Assembler 1.x.
  6964.  
  6965.  
  6966.          For simplicity, the make files provided assume that all MPLUS
  6967.          header and source files are in the current directory, and that
  6968.          all output goes to the current directory.  They also assume you
  6969.          will be using MASM.  Customize as needed.
  6970.  
  6971.          The default library created will be the small model.  To specify
  6972.          other models, use the following:
  6973.  
  6974.              MSC 5.x
  6975.              -------
  6976.              make model=X mplus.mak
  6977.  
  6978.              MSC 6.0
  6979.              -------
  6980.              nmake model=X /f mplus.nmk
  6981.  
  6982.          where X can be S, M, C, or L.
  6983.  
  6984.          MPLUS will not run properly as a huge model library.
  6985.          Applications compiled in the huge model may be linked with the
  6986.          large model MPLUS library.
  6987.  
  6988.  
  6989.  
  6990.  
  6991.  
  6992.  
  6993.          Copyright 1989-1991 by Michael Yam        About Source Code  D-1
  6994.  
  6995.  
  6996.  
  6997.  
  6998.  
  6999.          MPLUS                                          ABOUT SOURCE CODE
  7000.  
  7001.  
  7002.          MSC 6.0 users, please note that while NMAKE is smarter than
  7003.          MAKE, NMAKE requires more memory.  If the compiler complains
  7004.          about running out of heap space, you can use MAKE on MPLUS.MAK:
  7005.  
  7006.              make model=X compiler=MSC6 mplus.mak
  7007.  
  7008.  
  7009.          The C compile flags are the same for both MSC 5.x and 6.0:
  7010.  
  7011.              -Ox  maximum optimization.
  7012.              -Zl  don't include library-search records in object file.
  7013.  
  7014.  
  7015.          For MASM, there is only one required switch:
  7016.  
  7017.              /MX  mixed case.
  7018.  
  7019.  
  7020.          Likewise for TASM:
  7021.  
  7022.              /ml  mixed case, all symbols.
  7023.  
  7024.  
  7025.          Common Header Files
  7026.          -------------------
  7027.  
  7028.          These are the same header files distributed with the Shareware
  7029.          version of MPLUS.
  7030.  
  7031.              MPMENU.H                 for menu functions.
  7032.              GPLUS.H                  for MPLUS graphics functions.
  7033.              GSCREEN.H                contains color constants.
  7034.              MOUSER.H                 for mouse support.
  7035.  
  7036.  
  7037.          Special Header Files
  7038.          --------------------
  7039.  
  7040.          These headers are for the internal development of MPLUS.
  7041.  
  7042.              MPABORT.H                for abnormal exits.
  7043.              MPKEYS.H                 scan & ascii codes for keyboard.
  7044.              MPMEM.H                  for memory routines.
  7045.  
  7046.  
  7047.          Pre-1.3 versions also had a group of header files with names
  7048.          prefixed with an underscore.  These headers have been
  7049.          incorporated into the "common header" files and are now
  7050.          obsolete.
  7051.  
  7052.  
  7053.  
  7054.  
  7055.  
  7056.  
  7057.  
  7058.  
  7059.          Copyright 1989-1991 by Michael Yam        About Source Code  D-2
  7060.  
  7061.  
  7062.  
  7063.  
  7064.  
  7065.          MPLUS                                          ABOUT SOURCE CODE
  7066.  
  7067.  
  7068.          C Source
  7069.          --------
  7070.  
  7071.          MPLUS is split into 16 C modules.
  7072.  
  7073.              MPABORT.C                abort routine - resets the screen
  7074.                                       to the default, prints out the DOS
  7075.                                       errno, and calls abort().
  7076.              MPMENU.C                 Menu system.
  7077.              MPDIAL.C                 Dialogue Boxes.
  7078.              MPIMAGE.C                Graphic Images.
  7079.              MPINPUT.C                Input routine.
  7080.              MPLUS0.C                 mpsetvideomode() and related
  7081.                                       routines.
  7082.              MPLUS1.C                 mpouttext() and related routines.
  7083.              MPLUS2.C                 Other "core" graphics routines.
  7084.              MPLUS3.C                 mpoutgtext().  MSC 6.0 and up.
  7085.              MPGWDW0.C                Graphic windows.
  7086.              MPGWDW1.C                Code for the graphic root window.
  7087.              MPXORL.C                 xorline() and xorpt().
  7088.              MPMEM.C                  malloc() calls are routed here.
  7089.              MPMOUSE0.C               Mouse interrupt 33H.
  7090.              MPMOUSE1.C               Simple mouse routines.
  7091.              MPMOUSE2.C               Complex mouse routines.
  7092.  
  7093.  
  7094.          Asm Source
  7095.          ----------
  7096.  
  7097.          MPLUS has one assembler module.
  7098.  
  7099.              MS_EVENT.ASM             Interrupt routine for mouse event
  7100.                                       handler.
  7101.  
  7102.  
  7103.  
  7104.  
  7105.  
  7106.  
  7107.  
  7108.  
  7109.  
  7110.  
  7111.  
  7112.  
  7113.  
  7114.  
  7115.  
  7116.  
  7117.  
  7118.  
  7119.  
  7120.  
  7121.  
  7122.  
  7123.  
  7124.  
  7125.          Copyright 1989-1991 by Michael Yam        About Source Code  D-3
  7126.  
  7127.  
  7128.  
  7129.  
  7130.  
  7131.          MPLUS                                          ABOUT SOURCE CODE
  7132.  
  7133.  
  7134.  
  7135.          EXPANDED and EXTENDED MEMORY SUPPORT
  7136.  
  7137.          If your application requires expanded or extended memory
  7138.          support, MPMEM.C is the place to build it since all MPLUS
  7139.          malloc() calls are routed to this file.
  7140.  
  7141.          If you don't have expanded memory routines yet, don't reinvent
  7142.          the wheel.  Contact Intel for a free copy of their EMS Toolkit:
  7143.  
  7144.              Intel Corporation
  7145.              Development Tools Operation
  7146.              5200 NE Elam Young Parkway
  7147.              Hillsboro, OR  97124
  7148.  
  7149.              1-800-538-3373
  7150.  
  7151.              Ask for "The EMS TOOLKIT for C Developers."
  7152.  
  7153.  
  7154.          If you require extended memory support, call Microsoft Sales and
  7155.          Support at 1-800-426-9400 for their XMS specification.
  7156.  
  7157.          You'll also find useful information and XMS routines written by
  7158.          David Babcock in the Aug/Sept 1991 issue of the "C Gazette."
  7159.  
  7160.  
  7161.  
  7162.  
  7163.  
  7164.  
  7165.  
  7166.  
  7167.  
  7168.  
  7169.  
  7170.  
  7171.  
  7172.  
  7173.  
  7174.  
  7175.  
  7176.  
  7177.  
  7178.  
  7179.  
  7180.  
  7181.  
  7182.  
  7183.  
  7184.  
  7185.  
  7186.  
  7187.  
  7188.  
  7189.  
  7190.  
  7191.          Copyright 1989-1991 by Michael Yam        About Source Code  D-4
  7192.  
  7193.  
  7194.  
  7195.  
  7196.  
  7197.          MPLUS                                                  SHAREWARE
  7198.  
  7199.  
  7200.  
  7201.  
  7202.  
  7203.  
  7204.  
  7205.          APPENDIX E
  7206.          ----------
  7207.  
  7208.  
  7209.          SHAREWARE
  7210.  
  7211.              ...is an experiment in economics and trust.
  7212.  
  7213.  
  7214.          Shareware authors, in permitting their programs to be circulated
  7215.          and readily available for you to try, can bring to market
  7216.          quality software at a modest price.  There are two advantages to
  7217.          this system:
  7218.  
  7219.              1) given various hardware and personal requirements, the
  7220.                 user gets to try the software before buying.
  7221.  
  7222.              2) the author saves the expense of advertising,
  7223.                 packaging, and distribution, and passes the savings
  7224.                 on to the user.
  7225.  
  7226.  
  7227.          Shareware should not be confused with Public Domain or free
  7228.          software.  If you continue to use a Shareware program after
  7229.          evaluating it, you should honor the registration notice and pay
  7230.          the requested fee.  What you get in return depends on the
  7231.          author, but may include a printed manual, free updates, and
  7232.          telephone support.
  7233.  
  7234.          If the experiment is successful, a symbiotic relationship
  7235.          develops between you and the author; you get quality software at
  7236.          reduced prices and the author receives compensation and
  7237.          incentive to continue work on subsequent versions of the
  7238.          program.  The experiment is considered a failure if a parasitic
  7239.          relationship develops -- a situation where registration is
  7240.          ignored and the program is used nevertheless.  Should this be
  7241.          the case, the program either dies, or moves into conventional
  7242.          commercial markets to be sold at a higher price.
  7243.  
  7244.          The decision is yours.  Please choose to make the experiment a
  7245.          successful one.
  7246.  
  7247.  
  7248.  
  7249.  
  7250.  
  7251.  
  7252.  
  7253.  
  7254.  
  7255.  
  7256.  
  7257.          Copyright 1989-1991 by Michael Yam                Shareware  E-1
  7258.  
  7259.  
  7260.  
  7261.  
  7262.  
  7263.          MPLUS                                          OBTAINING SUPPORT
  7264.  
  7265.  
  7266.  
  7267.  
  7268.  
  7269.  
  7270.  
  7271.          APPENDIX F
  7272.          ----------
  7273.  
  7274.  
  7275.          OBTAINING SUPPORT
  7276.  
  7277.          Support is available through U.S. mail, Compuserve electronic
  7278.          mail, and by telephone.
  7279.  
  7280.          Support services are provided for registered users only.  While
  7281.          I can only help registered users with technical issues,
  7282.          inquiries about MPLUS and suggestions for its improvement are
  7283.          welcome by all.
  7284.  
  7285.          Describe the problem as thoroughly as possible and be sure to
  7286.          include the following information:
  7287.  
  7288.              1) your full name and where you may be reached.
  7289.              2) the version and memory model of MPLUS you were using.
  7290.              3) the version of DOS you were using.
  7291.              4) the contents of your autoexec.bat
  7292.              5) the contents of your config.sys
  7293.              6) your video card and the video mode your program was
  7294.                 running under when the problem occurred.
  7295.  
  7296.  
  7297.          Write to:
  7298.  
  7299.              Michael Yam
  7300.              230 East 88th St.  Apt 6B
  7301.              New York, NY  10128
  7302.  
  7303.          --- or ---
  7304.  
  7305.              Compuserve id: 76367,3040
  7306.  
  7307.          --- or ---
  7308.  
  7309.              Call (212) 996-2582, Monday thru Friday, 9am to 9pm,
  7310.              Eastern Time.
  7311.  
  7312.              Leave your message.  Response time is usually within 24
  7313.              hours.
  7314.  
  7315.              Phone support is limited to the United States and 30 minutes
  7316.              of total connect time over a 1 year period.
  7317.  
  7318.  
  7319.  
  7320.  
  7321.  
  7322.  
  7323.          Copyright 1989-1991 by Michael Yam        Obtaining Support  F-1
  7324.  
  7325.  
  7326.  
  7327.  
  7328.  
  7329.  
  7330.  
  7331.  
  7332.  
  7333.  
  7334.  
  7335.  
  7336.  
  7337.  
  7338.  
  7339.  
  7340.  
  7341.  
  7342.                               Last Page of MPLUS.DOC
  7343.  
  7344.  
  7345.  
  7346.  
  7347.  
  7348.  
  7349.  
  7350.  
  7351.  
  7352.  
  7353.  
  7354.  
  7355.  
  7356.  
  7357.  
  7358.  
  7359.  
  7360.  
  7361.  
  7362.  
  7363.  
  7364.  
  7365.  
  7366.  
  7367.  
  7368.  
  7369.  
  7370.  
  7371.  
  7372.  
  7373.  
  7374.  
  7375.  
  7376.  
  7377.  
  7378.  
  7379.  
  7380.  
  7381.  
  7382.  
  7383.  
  7384.  
  7385.  
  7386.  
  7387.  
  7388.  
  7389.  
  7390.  
  7391.  
  7392.  
  7393.  
  7394.  
  7395.          ----------------end-of-author's-documentation---------------
  7396.  
  7397.                          Software Library Information:
  7398.  
  7399.                     This disk copy provided as a service of
  7400.  
  7401.                            Public (software) Library
  7402.  
  7403.          We are not the authors of this program, nor are we associated
  7404.          with the author in any way other than as a distributor of the
  7405.          program in accordance with the author's terms of distribution.
  7406.  
  7407.          Please direct shareware payments and specific questions about
  7408.          this program to the author of the program, whose name appears
  7409.          elsewhere in  this documentation. If you have trouble getting
  7410.          in touch with the author,  we will do whatever we can to help
  7411.          you with your questions. All programs have been tested and do
  7412.          run.  To report problems,  please use the form that is in the
  7413.          file PROBLEM.DOC on many of our disks or in other written for-
  7414.          mat with screen printouts, if possible.  PsL cannot debug pro-
  7415.          programs over the telephone, though we can answer questions.
  7416.  
  7417.          Disks in the PsL are updated  monthly,  so if you did not get
  7418.          this disk directly from the PsL, you should be aware that the
  7419.          files in this set may no longer be the current versions. Also,
  7420.          if you got this disk from another vendor and are having prob-
  7421.          lems,  be aware that  some files may have become corrupted or
  7422.          lost by that vendor. Get a current, working disk from PsL.
  7423.  
  7424.          For a copy of the latest monthly software library newsletter
  7425.          and a list of the 3,000+ disks in the library, call or write
  7426.  
  7427.                            Public (software) Library
  7428.                                P.O.Box 35705 - F
  7429.                             Houston, TX 77235-5705
  7430.  
  7431.                                 1-800-2424-PSL
  7432.                              MC/Visa/AmEx/Discover
  7433.  
  7434.                           Outside of U.S. or in Texas
  7435.                           or for general information,
  7436.                               Call 1-713-524-6394
  7437.  
  7438.                           PsL also has an outstanding
  7439.                           catalog for the Macintosh.
  7440.  
  7441.